Click here to Skip to main content
14,924,633 members
Articles / Desktop Programming / MFC
Posted 25 Feb 2003


159 bookmarked

RC Localization Tool (LocalizeRC)

Rate me:
Please Sign up or sign in to vote.
4.89/5 (53 votes)
14 Jan 2004BSD9 min read
A tool for localizing/translating Resource Scripts



When I planned to release my shareware project in other languages, I searched for a simple but powerful tool which was able to create localized Resource Scripts (RC files). I didn't find any and so I started developing my own tool.

This tool, called LocalizeRC, scans Resource Scripts and extracts the language specific strings into an INI file. This file can be edited with any text editor. It then creates a new Resource Script with the translated strings from the INI file.


Although there is a lot of commercial software for translating resource files, I started developing LocalizeRC, because the other tools are all very complex and also very expensive. LocalizeRC is very easy to understand and makes it possible to create a translation within minutes! To supply more than one language just create a resource-only DLL from the Resource Script, which is created by LocalizeRC. The only disadvantage of LocalizeRC is that you have to compile the Resource Script for yourself. I will explain later, how to manage that.

Using the tool

First of all you have to create a software program in one language, like you normally do. All your translations start from this original language. My first language is always English, although I'm from Germany, because it is easier to find someone who is able to translate from English to his native language, than from German. But that is up to you...

Then you can start LocalizeRC and create a new workspace within a new folder (e.g. "German") by clicking on New.... As Input RC you should select the Resource Script in original language. For the Language INI and Output RC you should specify any filename for these files within the workspace folder (e.g. "German.ini" and "German.rc"). You can also choose any other folder but I recommend to have these three files in the same folder for reasons of clearness. Then click on the Create/Actualize INI from Input RC button.

Afterwards you can edit your Language INI with your standard editor by clicking the Open INI for Edit button. In the INI file there are two items per line. On the left side of the equals sign stands the original language. The rights side has to be replaced by the new language. You can also deploy this INI file to external translators. In the section [code_page] in the INI file, you can set the codepage that should be used in that RC. For a list of valid codepages look have a look at Links.

When you have finished translating the strings just save that INI file and close the editor. In LocalizeRC you should also check the option Copy Resource Header and "RES" Folder. Then the header "resource.h" and the files within the subfolder "RES" will be copied to the new folder which will later contain the Output RC. Afterwards you should click on the Create Output RC with INI button. Then LocalizeRC automatically creates the Output RC with the translated strings.

If you want to translate to Asian languages, you must perhaps use Unicode RCs, because some of these languages have more than 128/256 characters. Then you have to download the Unicode binary. Please notice that only Windows NT/2000/XP is fully compatible with Unicode.

As a result you should have created a folder with four files and one subfolder:

  • the workspace itself (with the extension lws)
  • the INI file (with the extension ini)
  • the Output Resource Script (with the extension rc)
  • the Resource header (resource.h)
  • and a subfolder called "RES", which contains all the resources like Bitmaps, Icons etc. from the Original Resource.

To use these files in your application, you have to create a resource-only DLL.

Create a resource-only DLL (satellite DLL)

I describe these steps for Visual C++.NET (7.0 or 7.1), but it should be very similar in 6.0 and 5.0.

  • Create a new Win32 Project in the folder, where the workspace and the Output RC files are
    (you can add it to your workspace/solution if you want).
  • In the wizard modify the application settings.
    Set the application type to DLL and check the option Empty project.
  • Then you have to add a few files to the new empty project.
    Under Project->Add existing item select the Output RC, which you created with LocalizeRC, and the "resource.h".
  • You can check now the translated dialogs and stringtable etc. in the resource view.
  • Go to Project->Properties->Linker->Advanced and select yes for the value Resource Only DLL.
  • Then you can compile the DLL

If you have got a MFC application, it will automatically load a satellite DLL if it has the filename ApplicationNameXXX.dll. The ApplicationName should be same name your application has (the filename without the extension .exe) and the XXX is a three-letter language code. MFC attempts to load the resource DLL for each of the following languages in order, stopping when it finds one:

  • (Windows 2000 or later only) The current user's default UI language, as returned from the GetUserDefaultUILanguage Win32 API.
  • (Windows 2000 or later only) The current user's default UI language, without any specific sublanguage (that is, ENC [Canadian English] becomes ENU [U.S. English]).
  • The system's default UI language. On Windows 2000 or higher, this is returned from the GetSystemDefaultUILanguage API. On other platforms, this is the language of the OS itself.
  • The system's default UI language, without any specific sublanguage.
  • A "fake" language with the 3-letter code LOC.

If MFC does not find any satellite DLLs, it uses the resources which are contained in the application itself (independent from the language). To load a language DLL manually, do the following steps before loading any dialog (e.g. in InitInstance). Call LoadLibrary for your language DLL then call AfxSetResourceHandle to make MFC loading all resources from that DLL. At application exit you have to free the language DLL via FreeLibrary.

For an example you can look at the source code of LocalizeRC.

Multiple languages within one file

After getting some mails why not including more than one language into one Resource Script and also into one EXE/DLL I will try to explain it here. In old Windows systems (Windows NT/9X/ME) there was an automatic selection of the right language, if more than one language was available in one EXE/DLL. This selection works in most of the cases. But in modern Windows systems (Windows 2000/XP/2003) this automatic selection doesn't work any more because of internal changes (for more information read the KB article 300680). Microsoft recommends to pack only one language into one file and so do I. Even in Windows NT/9X/ME there is no simple solution to override the automatic selection by the OS.

ANSI versus Unicode

LocalizeRC can either create ANSI or Unicode Resource Files (RCs). Because Windows 9X/ME doesn't fully support Unicode, you can only use the ANSI format with these Operating Systems. The Binary is different for these two versions. Please download the appropriate version or build them yourself.

ANSI files create strings with one byte for each character. That means that you can only store up to 256 different characters. That is enough to store the latin alphabet, but not enough for many other languages which uses much more characters. Therefore you need the Unicode format.

Unfortunately Visual Studio up to the current version 2003 isn't able to edit Unicode Resources. It only says: "Opened in another editor." However you can compile those resources without problems. So you must edit the RCs either with Notepad or another editor which is able to read and write Unicode. You find an example about Handling of Unicode Resources at the MSDN Library in the Links section.

Links and Miscellaneous


MSDN Library


I want to make LocalizeRC a real open-source software. Please send your additions/modifications and bugreports as well as typos in the website and the program to Also send your wishes for the next version. Please supply me with your translation for LocalizeRC. A new icon would also be very nice ;-).

This is the preliminary Todo list for LocalizeRC:

  • Comparison of two RCs and create an INI from these (if you already have a translated RC)
  • Include the ID of the button/dialog etc. in the INI
  • Include FontName and FontSize in INI file (because of different fonts for other languages)

This project is a thank to all the great authors and helpful developers at Codeproject!


  • 26.02.2003 - Release of LocalizeRC 1.0.
  • 28.02.2003 - First Update to Version 1.1.
    Can now be build under VC++6 (thanks to Chris Richardson), fixed some bugs.
  • 30.03.2003 - Version 1.2 released
    • Unicode version available
    • fixed bugs:
      • creating DLGINIT sections in OutputRC even works with preprocessor conditions
      • extract all strings to INI, even if "BEGIN" or "END" occurs within a string
      • even under Win9X RCs with a size above 64K are shown in the edit field (now using RichEdit)
      • no invalid memory access while creating INI, if combobox strings have odd number of chars
    • removed numbers from button captions
    • automatically load InputRC to edit field, while loading workspace
    • extract codepage to INI file
  • 06.04.2003 - Version 1.3 released
    • sorting changeable
    • fixed bugs:
      • correct newlines in UNICODE and ANSI (Notepad compatible)
      • correct handling of BOMs (Byte Order Marks) in UNICODE
      • DLGINIT sections work for more than one combobox in one dialog
      • no "Out Of Memory" error, when extracting strings that have enclosed ENDs or BEGINs
      • reopen InputRC before creating INIs
      • no error if INI doesn't already exist
  • 06.05.2003 - Version 1.4 released
    • easier interface for workspace handling - 3 buttons: "new", "open", "modify"
    • Cancel button in Create/Modify Workspace dialog
    • fixed bugs:
      • no "an unnamed file contains an invalid path" error while creating a new workspace
      • also translates static-controls with SS_SUNKEN and SS_LEFTNOWORDWRAP attributes
      • edit field for workspace filename is now read-only, because changing wasn't recognized if typed directly
      • changes are saved at program exit to workspace file, because checkboxes have now NOTIFY attribute
      • also recognizes multiline commands that end with spaces after the "|" (better compatibility with some Visual Studio versions)
      • correct 16x16 icon in window
  • 04.11.2003 - Version 1.5 released
    • extended error messages
    • easier workspace handling
    • fixed some bugs
    • added information about Unicode Resources to this website.
  • 13.01.2004 - Version 1.6 released
    • fixed bugs:
      • empty captions in controls are correctly handled (thanks to Diego Tartara)
      • captions containing an "=" are correctly handled (thanks to Diego Tartara)
    • added information about multiple languages within one file to this website
    • added Todo list to this website


This article, along with any associated source code and files, is licensed under The BSD License


About the Author

Konrad Windszus
Web Developer
Germany Germany
Author of the shareware WinCD.

Comments and Discussions

GeneralUpdated Unicode version Pin
WDPS - Joe25-Sep-14 5:27
MemberWDPS - Joe25-Sep-14 5:27 
AnswerRe: Updated Unicode version Pin
Alchemie100020-Feb-15 6:11
MemberAlchemie100020-Feb-15 6:11 
GeneralRe: Updated Unicode version Pin
Alchemie100021-Feb-15 4:45
MemberAlchemie100021-Feb-15 4:45 
QuestionBug with UNICODE (+solution) Pin
Member 861914930-Jul-14 10:56
MemberMember 861914930-Jul-14 10:56 
Generalnew rc remains in the original language Pin
kulight12-Oct-10 23:58
Memberkulight12-Oct-10 23:58 
QuestionAny new versions? Pin
thready17-Sep-09 3:17
Memberthready17-Sep-09 3:17 
GeneralMFC VS2005 Pin
sabdalla809-Feb-09 4:03
Membersabdalla809-Feb-09 4:03 
General[bug] error encoding reading dlginit data Pin
Xuefer22-Jun-08 23:13
MemberXuefer22-Jun-08 23:13 
GeneralRe: [bug] error encoding reading dlginit data Pin
Xuefer22-Jun-08 23:21
MemberXuefer22-Jun-08 23:21 
General[bug] error reading localized rc file as ansi mode Pin
Xuefer22-Jun-08 23:10
MemberXuefer22-Jun-08 23:10 
QuestionHow do I update dll if main app changes ? Pin
worksopbenny14-Oct-07 20:34
Memberworksopbenny14-Oct-07 20:34 
AnswerRe: How do I update dll if main app changes ? Pin
thready17-Sep-09 3:10
Memberthready17-Sep-09 3:10 
GeneralLoosing dialog modifications after update Pin
Ruben Jönsson31-Jul-07 1:58
MemberRuben Jönsson31-Jul-07 1:58 
Questioncodepage for Hindi etc Pin
c_srishti19-Apr-07 11:59
Memberc_srishti19-Apr-07 11:59 
GeneralV1 & V2 (beta) don't understand RC2 resource files Pin
-273C27-Oct-06 1:15
Member-273C27-Oct-06 1:15 
QuestionLocalizeRC v2 ? Pin
.dan.g.1-Oct-06 22:12
professional.dan.g.1-Oct-06 22:12 
AnswerRe: LocalizeRC v2 ? Pin
Konrad Windszus3-Oct-06 0:31
MemberKonrad Windszus3-Oct-06 0:31 
GeneralRe: LocalizeRC v2 ? Pin
-273C19-Oct-06 11:37
Member-273C19-Oct-06 11:37 
GeneralRe: LocalizeRC v2 ? Pin
.dan.g.20-Nov-07 11:34
professional.dan.g.20-Nov-07 11:34 
GeneralBreakage fix Pin
emilytzgyr18-Jul-06 1:30
Memberemilytzgyr18-Jul-06 1:30 
GeneralA tool for merging a localization from one xml file with another Pin
yarus2421-Jun-06 3:33
Memberyarus2421-Jun-06 3:33 
Generalstat() failes for Japanese filename with the long path Pin
Sandeep. Vaidya23-Mar-06 2:57
MemberSandeep. Vaidya23-Mar-06 2:57 
GeneralRe: stat() failes for Japanese filename with the long path Pin
Konrad Windszus23-Mar-06 8:52
MemberKonrad Windszus23-Mar-06 8:52 
GeneralRe: stat() failes for Japanese filename with the long path Pin
Sandeep. Vaidya23-Mar-06 19:16
MemberSandeep. Vaidya23-Mar-06 19:16 
GeneralRe: stat() failes for Japanese filename with the long path Pin
Konrad Windszus23-Mar-06 20:23
MemberKonrad Windszus23-Mar-06 20:23 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.