Lingobit Extractor

Text stuck in the code? Move it into resources in one pass.

Before translation, run your C++, C#, Visual Basic .NET, Delphi, or Java code through Lingobit Extractor. It moves the strings into the resources your platform uses and puts the code that loads them in their place. Then Lingobit Localizer translates your build.

View pricing

Lingobit ExtractorC++OrderDlg.cppExtractvoid COrderDlg::OnSave(){ SaveOrder(); SetStatus(_T("Order saved"));_LS( IDS_ORDER_SAVED ));}RCStrings.rc2STRINGTABLEBEGIN IDS_ORDER_SAVED "Order saved"END"Order saved"IDS_ORDER_SAVEDBuildEXEMyApp.exeLingobit LocalizerProjectMyApp.exeDE15000string tableOrder savedBestellung gespeichert Lingobit ExtractorC++OrderDlg.cppExtractvoid COrderDlg::OnSave(){ SaveOrder(); SetStatus( _T("Order saved"));_LS( IDS_ORDER_SAVED ));}RCStrings.rc2STRINGTABLEBEGIN IDS_ORDER_SAVED "Order saved"END"Order saved"IDS_ORDER_SAVEDBuildEXEMyApp.exeLingobit LocalizerProjectMyApp.exeDE15000string tableOrder savedBestellung gespeichert
Source code
C and C++, C#, Visual Basic .NET, Delphi, Java
Resources
RC string tables, RESX, Delphi resourcestring units, Java .properties
Then
Lingobit Localizer translates your build
Trial
30 days, a separate download
On this page

Pseudo Translate shows text that stays in English.

Before translation you check the application with Pseudo Translate in Lingobit Localizer, and one text does not change: it is written in the code, not in the resources, so no translation can reach it.

Moving such strings into resources by hand is long and dull, and it never ends: each new message during development is one more.

Pseudo Translate: Professional and higher.

Pseudo TranslateGerman Simulation · Expand text by 30%New OrderNew ÖrderNeCustomer:Cüßtömer:CüQuantity:Qüäntity:QüShip todayShip tödäyShiPrint receiptPrint receiptPriCreateCreäteCCancelCäncelCOrder savedStill in English Pseudo TranslateGerman Simulation · Expand text by 30%New OrderNew ÖrderNeCustomer:Cüßtömer:CüQuantity:Qüäntity:QüShip todayShip tödäyShiPrint receiptPrint receiptPriCreateCreäteCCancelCäncelCOrder savedStill in English

Lingobit Extractor moves it into resources.

Pick your language: Extractor writes the resources your platform already uses, with an ID made from the words of the string, and puts the code that loads it in place of the text.

C and C++

The string goes into a separate .rc2 file, and the code loads it with _LS, _LSW, or _LSA. Files .c, .cpp, .h, and .hpp.

C++OrderDlg.cppExtractvoid COrderDlg::OnSave(){ SaveOrder(); SetStatus(_T("Order saved"));_LS( IDS_ORDER_SAVED ));}RCStrings.rc2STRINGTABLEBEGIN IDS_ORDER_SAVED "Order saved"END"Order saved"IDS_ORDER_SAVED C++OrderDlg.cppExtractvoid COrderDlg::OnSave(){ SaveOrder(); SetStatus( _T("Order saved"));_LS( IDS_ORDER_SAVED ));}RCStrings.rc2STRINGTABLEBEGIN IDS_ORDER_SAVED "Order saved"END"Order saved"IDS_ORDER_SAVED

C# and Visual Basic .NET

The string goes into a .resx file. C# reads it from the strongly typed resource class, Visual Basic .NET from My.Resources. Generated files such as *.Designer.cs and AssemblyInfo are left alone.

C#OrderForm.csExtractvoid OnSave(){ SaveOrder(); statusLabel.Text = "Order saved";Properties.UI.str_Order_saved;}RESXUI.resxName Valuestr_Order_saved Order savedOrder savedstr_Order_saved C#OrderForm.csExtractvoid OnSave(){ SaveOrder(); statusLabel.Text = "Order saved";Properties.UI.str_Order_saved;}RESXUI.resxName Valuestr_Order_saved Order savedOrder savedstr_Order_saved

Delphi

The string goes into the resourcestring section of a unit, and the code uses its name. Files .pas, .dpr, and .p.

DelphiOrderForm.pasExtractprocedure TOrderForm.Save;begin SaveOrder; StatusBar.SimpleText := 'Order saved';AppStrings.OrderSavedStr;end;PASAppStrings.pasresourcestring OrderSavedStr = 'Order saved';'Order saved'OrderSavedStr DelphiOrderForm.pasExtractprocedure TOrderForm.Save;begin SaveOrder; StatusBar.SimpleText := 'Order saved';AppStrings.OrderSavedStr;end;PASAppStrings.pasresourcestring OrderSavedStr = 'Order saved';'Order saved'OrderSavedStr

Java

The string goes into a .properties file, and the code reads it with a getString method, a generated wrapper class, or ResourceBundle. Files .java.

JavaOrderView.javaExtractvoid onSave() { saveOrder(); status.setText("Order saved");getString("Order_saved"));}PROPERTIESMessages.propertiesOrder_saved=Order savedOrder savedOrder_saved JavaOrderView.javaExtractvoid onSave() { saveOrder(); status.setText( "Order saved");getString("Order_saved"));}PROPERTIESMessages.propertiesOrder_saved=Order savedOrder savedOrder_saved

Extractor also reads XAML, with bindings to a resource wrapper class, and ASP.NET pages, with resource expressions.

How to work with Extractor.

Not every string is text: a window class name, an SQL query, or a registry key has to stay in the code. You decide what moves.

Lingobit ExtractorScanScanStringSourceState"Order saved"OrderDlg.cpp:42NewExtract"%d"OrderDlg.cpp:57Newfiltered out: no letters"OrderWindow"OrderDlg.cpp:12NewSkip"SELECT * FROM Orders"OrderDb.cpp:30NewSkip"Print the order"OrderDlg.cpp:88NewExtract"Software\\MyApp"Settings.cpp:9NewSkip"Gift wrap"OrderDlg.cpp:95NewAt the next Scan, skipped strings stay skipped and extracted ones stay in the resources:only the new string is New. Lingobit ExtractorScanScanStringState"Order saved"NewExtract"%d"Newfiltered out: no letters"OrderWindow"NewSkip"SELECT * FROM Ord…"NewSkip"Print the order"NewExtract"Software\\MyApp"NewSkip"Gift wrap"NewAt the next Scan only the new stringis New; skipped ones stay skipped.
  1. Add the codeSource files or a whole folder. Generated files such as *.Designer.cs are left alone.

  2. ScanExtractor lists the string literals. Filters drop strings without letters and strings that match your patterns.

  3. Skip or ExtractSkip the technical strings and extract the rest. Use Existing Resource String gives repeated text the resource that is already there.

  4. BuildInclude the resources (C++: the .rc2 and ResString.h; .NET: save the .resx in Visual Studio) and build. Lingobit Localizer translates the build, not the .rc or .resx file; for Java, the .properties files or the JAR.

  5. Scan againWhen the code changes, only the new strings show up; what you skipped stays skipped.

Check again: now it comes from the resources.

Pseudo Translate once more: the status text is pseudo-translated with the rest. Then create the localized files and run the application in the pseudo-language: it should work exactly as the original.

Pseudo TranslateRun Localized ApplicationNew OrderNew ÖrderNeCustomer:Cüßtömer:CüQuantity:Qüäntity:QüShip todayShip tödäyShiPrint receiptPrint receiptPriCreateCreäteCCancelCäncelCOrder savedÖrder ßävedÖrdFrom the resourcesWorks as the original Pseudo TranslateRun Localized ApplicationNew OrderNew ÖrderNeCustomer:Cüßtömer:CüQuantity:Qüäntity:QüShip todayShip tödäyShiPrint receiptPrint receiptPriCreateCreäteCCancelCäncelCOrder savedÖrder ßävedÖrdFrom the resourcesWorks

If the translated application fails, Crash Finder finds why.

A translation can break the program: a format string that lost its placeholder, or a string longer than the buffer the code reserved. Crash Finder builds test versions with part of the translations, you answer whether each one failed, and every answer halves the suspects.

Enterprise

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.

Try it on your own code.

The Extractor trial runs for 30 days with every function. In each resource file the first 50 extracted strings are written as they are; after that, some may end in _TRIAL.

What Extractor does and does not promise.

Extractor changes your source code; the development team stays responsible for it.

What Extractor helps with

  • Finding string literals in source files and folders
  • Moving them into RC, RESX, Delphi, or Java resources
  • IDs made from the text, and the code that loads them
  • Filters, Skip, and the next Scan

What remains project-side

  • Reviewing which strings to extract
  • Including the resources in the build
  • Loading resources and switching languages at run time
  • Building and testing the application
  • Localization preparationLock technical strings and test the application in a pseudo-language before translation.
  • Localization QAValidation and Crash Finder for the translated application.
  • PricingExtractor and Extractor Multi-User licenses.

Hard-coded strings? Move them into resources.

Run your code through Extractor before translation, build, and translate the build with Lingobit Localizer.