Resource Localization Manager User's Guide
Version 1.72
05/03/94 09:51 AM
Copyright © 1992-1994 Microsoft Corporation


Table of Contents
Table of Contents	2
Introduction	3
Usage:	4
Languages IDs	6
Localization Process	8
One-Shot Process	8
Parallel Process	9
Project Creation	9
Maintaining the Master Project	9
Maintaining Each Locale Project	9
Data Files and Formats	10
Master Project Files (MPJ)	10
Project Files (PRJ)	10
Master Token Files (MTK)	11
Language Token Files (TOK)	12
Resource Description Files (RDF)	13



Introduction
In the past, localization  of a software product required the localizer to edit strings and controls 
embedded in source code and then rebuild the product in order to test the localized version. Such a process 
requires at least a rudimentary knowledge of computer programming and is often prone to human error. 
The Resource Localization Manager (hereafter referred to as RLMan) was designed to automate 
localization of products that make use of the Windows resource model by allowing the localizer to extract 
localizable resources directly from the applications that use them, modify the resources, and use the 
modified resources to create localized versions of the original applications. All this can be achieved 
without rebuilding the product and with minimal knowledge of computer operations.
RLMan was designed with several goals in mind. Some of these goals were:
*	Allow the product to be localized without re-compilation.
*	Allow localization to proceed concurrent with development (provide update capability).
*	Allow localizers to share glossaries of common terms among applications.
The localization model followed by the RLMan is very simple. Localizable resources are extracted from a 
source resource file  and put into special text file called a token file. Each localizable resource may 
generate one or more tokens. Each token is contained on a single line of text and consists of a unique 
identifier followed by the localizable data associated with that particular resource. These tokens can then 
be localized by using a standard text editor.
The localized tokens are then used in conjunction with the source resource file to generate a new localized 
resource file. The term "resource file" in this document means "any Windows executable format file 
(.EXE, .DLL, .CPL, etc.) or .RES file". The target resource file will contain exactly the same resources as 
the source resource file, the only difference is that the data will be localized.
This model has been expanded a little to allow for update tracking. When localization is done in 
conjunction with development a target resource file may change after the localizer has tokenized the file 
and begun translation. Update tracking allows the localizer to update the localized token file without 
losing any work that might have been done. Any resources that may have changed since the most recent 
update are marked "dirty" and the change is tracked in the token file so the localizer may see exactly what 
changed and exactly how it changed.
To allow for update tracking, the source resource file is used to generate a "master token file" which tracks 
changes. The master token file is then used to update any number of "language token files" (one for each 
target language). These language token files are then localized and used to generate the target resource 
files.


Usage:
Any file name can include a UNC (Unified Naming Convention) share name or drive letter, and a 
directory path.
The syntax of the 'RLMan' command is as follows:
rlman [-c RDFile] [ -p CodePage ] [ -f ResType ] [-{n|o} PriLang  SubLang] [-w]  -{e|t|m|l|r|a} files
-e  InputExeFile  OutputResFile
Extract localizable resources from the resource file (.exe, .dll, .cpl, .etc.) InputExeFile and create 
a Win32 resource file OutputResFile. This output file can then be used, for example, by the 
dialog box editor or the bit map editors that come with the SDK.
-t  InputResOrExeFile  OuputTokenFile
This option will extract the localizable resources from the executable or resource format file 
InputResOrExeFile and create a project token file OuputTokenFile. Using this option will 
circumvent the history-keeping mechanism of RLMan. It is made available for those times when 
the user wants to simply see what localizable resources are in the input file or when the history 
mechanism is not needed. Using the -o option and the -p option with the -t option will allow one 
to extract and tokenize resources of a specific language. The resulting token file will contain only 
those resources that have the specified locale and the text will be in the given code page.
-m  MasterProjectFile  [ InputResOrExeFile  MasterTokenFile ]
When the history mechanism is wanted, the first step when creating a new master project or 
updating an existing master project is to use this option. If the MasterProjectFile does not exist, 
the optional InputResOrExeFile and MasterTokenFile arguments must be provided. These last 
two arguments will be ignored if the MasterProjectFile exists.
-l  LanguageProjectFile  [ MasterProjectFile  LanguageTokenFile ]
This option is used, when the history mechanism is wanted, to create a new localization project 
or to update an existing project. If the LanguageProjectFile does not exist, the optional 
MasterProjectFile (the one created via the -m option) and LanguageTokenFile arguments must 
be provided. These last two arguments will be ignored if the LanguageProjectFile exists.
-r  InputResOrExeFile  LanguageTokenFile_or_ResFile  OutputResOrExeFile	
This option is used to create a localized version of the InputResOrExeFile. The resources in that 
InputResOrExeFile will be replaced with the localized resources in 
LanguageTokenFile_or_ResFile. OutputResOrExeFile is the localized version. . If the 
LanguageTokenFile_or_ResFile is a Token file, use the -o option to specifiy what the old 
language to be replaced is and use the -n option to specifiy what the new language is.
-a  InputResOrExeFile  LanguageTokenFile_or_ResFile  OutputResOrExeFile	
This option is used to create a localized version of the InputResOrExeFile. The resources in the 
resulting OutputResOrExeFile will include the original resources from InputResOrExeFile plus 
the localized resources in LanguageTokenFile_or_ResFile. If the 
LanguageTokenFile_or_ResFile is a Token file, use the -n option to specifiy what the new 
language is.
-n PriLang  SubLang
Specifies what the language the tokens in the token file are in and consequently what language 
the new resources are in. Used when setting up a new Language Project (-l) and with the -r and -
a options. Can also be used with the -m option when the resources in the original resource file 
are not in U.S. English. PriLang  SubLang are decimal values from the list of allowed values in 
the SDK.
-o PriLangID  SubID
Specifies what the language the  resources being replaced in, or extracted from, the source 
resource file are in.
Used with the -r and -a options when the resources being replaced, or added to, in the original 
resource file are not in U.S. English. PriLang  SubLang are decimal values from the list of 
allowed values in the SDK. For example, if the U.S. English resources had been replaced with 
German resources and now you wanted to add French resources to that German file, use the -o 
option (with arguments 7 1) to indicate that the original resources are in German not U.S English 
together with the -a option. Or, if you had created a file with U.S. English plus German resources 
in it, and now you wanted to replace the German resources with French (thus making a U.S 
English plus French file), you would use the -r option with the -o option (with arguments 7 1) 
and the -n option ( with arguments 12 1) to indicate that the old German resources are to be 
replaced with the new ones in the given French token file.
Used with the -t option, this identifies the language of the resources that are to be tokenized. You 
should also use the -p option to specifiy the code page the text in the token file is to be written in.
-c  RDFile
Use custom resources defined in the resource description file RDFile.
-p  CodePage
The default code page used in converting between the Unicode resources and the text in the token 
files is the Windows ANSI code page. To change the code page, use this option and use the IBM 
code page number as the CodePage argument. For example; -p 932.
-f  ResourceType
By default, all localizable resources are extracted. To extract a single resource type, use this 
option with ResourceType set to the resource type's numeric value (1-16 for Windows resources).
-w
Print warnings about unknown custom resource types (-c option not given or resource type is not 
in the RDFFile), and about resources that are not tokenized because their language is not the 
language requested (-o  option, or US English by default). It will also warn of any zero-length 
resources found.


Languages IDs
Primary Language ID's

Sub language IDs.


Neutral
0x00
Neutral
0x00

Albanian
0x1c
Default
0x01

Arabic
0x01
System Default
0x02

Bahasa
0x21
Arabic (Saudia Arabia)
0x04

Bulgarian
0x02
Arabic (Iraq)
0x08

Byelorussian
0x23
Arabic (Egypt)
0x0C

Catalan 
0x03
Arabic (Libya)
0x10

Chinese
0x04
Arabic (Algeria)
0x14

Czech
0x05
Arabic (Morocco)
0x18

Danish
0x06
Arabic (Tuinisa)
0x1C

Dutch
0x13
Arabic (Oman)
0x20

English 
0x09
Arabic (Yemen)
0x24

Estonian
0x25
Arabic (Syria)
0x28

Farsi
0x29
Arabic (Jordan)
0x2C

Finnish
0x0b
Arabic (Lebanon)
0x30

French
0x0c
Arabic (Kuwait)
0x34

German
0x07
Arabic (U.A.E.)
0x38

Greek
0x08
Arabic (Bahrain)
0x3C

Hebrew
0x0d
Arabic (Qatar)
0x40

Hungarian
0x0e
Chinese (Traditional)
0x01

Icelandic
0x0f
Chinese (Simplified)
0x02

Italian 
0x10
Chinese (Taiwan)
0x04

Japanese
0x11
Chinese (PRC)
0x08

Kampuchean
0x2c
Chinese (Hong Kong)
0x0C

Korean
0x12
Chinese (Singapore)
0x10

Laotian
0x2b
Dutch
0x01

Latvian
0x26
Dutch (Belgian) 
0x02

Lithuanian
0x27
English (US)
0x01

Maori
0x28
English (UK)
0x02

Norwegian
0x14
English (Australian)
0x03

Polish
0x15
English (Canadian)
0x04

Portuguese
0x16
English (New Zealand)
0x05

Rhaeto Roman
0x17
English (Ireland)
0x06

Romanian
0x18
French
0x01

Russian
0x19
French (Belgian)
0x02

Serbo Croatian
0x1a
French (Canadian)
0x03

Slovak
0x1b
French (Swiss)
0x04

Spanish 
0x0a
German
0x01

Swedish 
0x1d
German (Swiss)
0x02

Thai
0x1e
German (Austrian)
0x03

Turkish 
0x1f
Hebrew (Israel)
0x04

Ukrainian
0x22
Italian
0x01

Urdu
0x20
Italian (Swiss)
0x02

Vietnamese
0x2a
Japanese (Japan)
0x04






Sub language IDs. (cont.)




Korean (Korea)
0x04



Norwegian (Bokmal)
0x01



Norwegian (Nynorsk)
0x02



Portuguese (Brazilian)
0x01



Portuguese
0x02



Serbo Croatian (Latin)
0x01



Serbo Croatian 
(Cyrillic)
0x02



Spanish (Traditional 
Sort)
0x01



Spanish (Mexican)
0x02



Spanish (Modern Sort)
0x03



Thai (Thailand)
0x04




Localization Process
There are two basic types of localization. The first is when a product is correctly enabled for localization 
("globalized"), the product development is finished, and all that is needed is to modify the localizable 
resources. We'll call this the "one-shot process". The second is when a product is being localized in 
parallel with the development process and the localization work is to be preserved across new builds of the 
original (typically English) file. We'll call this the "parallel process". It is done in parallel with product 
development so the localized versions are ready as soon as possible after the domestic version is.
The next two sections describe, in a step-by-step list, the procedure to use for the two processes. In the 
sample command lines, the executable is called "prog.exe". A GUI version of RLMan is being developed. 
That version will make the various steps invisible to the user and will incorporate an editor that hides the 
token ID part of the lines in the token file.
One-Shot Process
To simplify the file names on the command line, change directories to the place where the localized files 
are to be kept. Leave the source executable (typically the English version) in some other directory * 
anywhere on the network or on the local machine.
If you have a localized .RES file, simply skip to step 4 and use the .RES file in place of the .TOK file 
name shown in that step’s example.
1.	Create the project token file "prog.tok".

rlman -t prog.exe  prog.tok
2.	Translate the text in the "prog.tok" file with your favorite text editor. Assume German in this 
example.
3.	If dialog boxes are to be resized, create the file "tmpprog.exe" which will contain the translated text.

	rlman -n 7 1 -r prog.exe  prog.tok  tmpprog.exe
Create the .RES file, in German, needed by the dialog editor in the SDK.

rlman -e tmpprog.exe  prog.res
Resize the dialog boxes as appropriate to account for the different lengths of the translated text.

dlgedit prog.res
Update the project token file with the revised dialog box coordinates and sizes.

rlman -t prog.res  prog.tok
4.	Create the final, localized, executable.

rlman -n 7 1 -r prog.exe  prog.tok  newprog.exe
This completes the process. The German file "newprog.exe" is now ready to be tested.


Parallel Process
This process maintains the localization work from one build of the source executable (typically the 
English version) to the next. With this version of RLMan there is one caveat * if the developers change 
the ID number of a localizable item, the previous translation will be lost. This is being addressed and a 
solution will be available in a future release of RLMan. New items can be added or old ones deleted but an 
item with a changed ID will show up as a new item.
Project Creation
1.	Create a directory for the master files and a separate directory for the project files. These 
directories may be anywhere on the net. The master project directory may contain any 
number of master projects, one need not create a new directory for each project as long as the 
base name for each master project in unique. There should be a separate directory for each 
localized version of the executable file. Typically this means one directory for each language.
2.	Move to the master directory.
3.	Copy the source executable to the master directory.
4.	Create the master project file and the master token file.

rlman -m prog.mpj  prog.exe  prog.mtk
5.	Move to the project directory (for German in this example).
6.	Create the project file and the project token file.

rlman -n 7 1 -l prog.prj  prog.mpj  prog.tok
7.	Steps 5 and 6 need to be repeated for each project directory (language). The resulting 
prog.tok files can then be translated to the appropriate language.
Maintaining the Master Project
1.	Copy the newly built source executable to the master directory.
2.	Move to the master directory, then update the master project file and the master token file.

rlman -m prog.mpj
Maintaining Each Locale Project
1.	Follow steps 2 and 3 of the "one-shot process" (previous page) as often as desired until the 
resources are localized satisfactorily.
2.	Every time the master project is been updated (step 2 in the "Maintaining the Master Project" 
section), update the project file and project token file.

rlman -l prog.prj
Repeat step 1 as needed to catch new or changed resource items.


Data Files and Formats
RLMan uses a variety of special file types. All of the file formats described below are a special form of text 
file. Each file is human-readable and can be edited with any standard text file editor (such as Notepad).
As a general rule, all text in these files follows the C escape convention when dealing with non-
displayable characters. This convention uses escape characters to represent non-displayable characters. 
For example, \n is newline and \t is tab.
Master Project Files (MPJ)
Master project files consist of four lines of text:
*	The first line contains the path to the source resource file. This may be either a .RES file, or an .EXE 
format file.
*	The second line contains the path to the master token file (MTK).
*	The third line contains zero, one or more paths to resource description files (RDFs) separated by 
spaces.
*	The fourth line contains a date stamp indicating the date of the source resource file as of the last 
update.
*	The fifth line contains a date stamp indicating the date of the master token file as of the last update of 
the master project.
*	The sixth line contains the Language ID of the resources in the master token file (.MTK).
Project Files (PRJ)
Project files consist of five lines of text:
*	The first line contains the path to the master project file (MPJ).
*	The second line contains the path to the language token file (TOK).
*	The third line contains the path to the target resource file. This may be either a .RES file or (if the 
source resource in the MTK is an .EXE file) an .EXE format file.
*	The fourth line contains a date stamp indicating the date of the master token file (MTK) as of the last 
update of the project.
*	The fifth line may be left blank or it may contain the path to a glossary file. (Not used in this release.)
*	The sixth line contains the code page used when reading/writing the project token file. A zero (0) 
means the system's Windows ANSI code page. A one (1) means the syetem's default OEM code page.
*	The seventh line contains the Language ID of the resources in the language token file (.TOK).


Master Token Files (MTK)
Master token files are text files which contain tokenized resources taken from some source resource file. 
Each token consists of a unique identifier followed by the text form of the resource data. Tokens are 
delimited by end-of-line characters.
Master token files are used for update tracking. They contain no localized resource data and should not be 
changed except by RLMan.
An example of what one token might look like is shown below:
	[[5|255|1|32|5|"FOO"]]=Localizable string containing text in C format.
The token ID is surrounded by double square brackets and divided into 6 fields delimited by the vertical 
pipe '|' symbol:
*	The first field indicates the type of the resource
*	The second field is the resource name in the case of an enumerated resource, or it is 65535 if the 
name is a label (string) in which case the label itself is stored in the sixth field.
*	The third field is the internal resource id number taken from the resource header.
*	The fourth field is made up of a combination of data taken from the resource header and generated by 
the tools. This value is used in conjunction with the other values in the token ID to uniquely identify 
the resource.
*	The fifth field is a status field used by the update tools to determine the status of the current token.
*	The sixth field contains the name of the resource if the resource is identified by a label. Otherwise it 
contains a null string.
A token ID is followed by an equal sign which is in turn followed by the resource data. The data extends 
from after the equal sign to the end of the line (exclusive). Non printing characters (such as new-line and 
control characters) are represented using C escape sequences. Two of the most common are \n for new-
line and \t for tab. Some characters are shown in the form '\nnn' where nnn is the decimal value of that 
character.
A token's status field is made up of combinations (bitwise OR'ing) of three basic flags:
*	CHANGED		4	indicates that the token has changed since the last update
*	READONLY	2	indicates that the token should not be localized.
*	NEW		1	used in conjunction with the CHANGED flag to indicate that this is 
the new version of the token.
For example, if a token has changed during an update, the current text would be stored in a token with a 
status of CHANGED+NEW (4 + 1) = 5. The previous text is also stored in the token file using the same 
token ID but the status field would contain a 4 (CHANGED). This way both the current and the previous 
text are retained.


Language Token Files (TOK)
Language token files are similar to master token files; the only difference being the meaning of the status 
fields found in the token identifiers.
Language token files are used during localization. They contain localized resource data.
A token's status field is made up by combinations of four flags:
*	TRANSLATED	4	indicates that the token contains text that should be put in the target 
resource. If a token is not marked as TRANSLATED then it contains 
unlocalized text from the master token file which is maintained for 
update tracking purposes.
*	READONLY	2	indicates that the token should not be localized.
*	NEW		1	used only for tokens that are not marked with the TRANSLATED 
flag to indicate that this is the new version of the unlocalized token.
*	DIRTY		1	used only for tokens that are marked with the TRANSLATED flag to 
indicate that the token is in need of attention (either the original 
translation has changed or the token has never been localized).
For example, a clean, localized token is marked only with the TRANSLATED flag and therefore has a 
status value of 4.
As in the Master token files, non printing characters (such as new-line and control characters) are 
represented (and entered by the localizer) using C escape sequences. Two of the most common are \n for 
new-line and \t for tab. Some characters are shown or entered in the form '\nnn' where nnn is the decimal 
value of that character. The localizer may enter any character it's '\nnn' form.


Resource Description Files (RDF)
Custom resources are described in resource description files (RDFs) using c-like structure definitions.  
Each definition is identified with a specific resource type and the definition is applied to every resource of 
that given type.
An identifier is declared by the following syntax:
<type>
Types are numbers or quoted names unless they are normal windows types in which case the standard 
Windows type name may be used in place of a number or name. (CURSOR, BITMAP, ICON, MENU, 
DIALOG, STRING, FONTDIR, FONT, ACCELERATORS, RCDATA, ERRTABLE, GROUP_CURSOR, 
GROUP_ICON, NAMETABLE, and VERSION).
A structure definition follows normal 'C' syntax with the following limitations and differences:
*	Each definition must be fully enclosed in braces {  }.
*	The standard 'C' types: char (single-byte OEM characters), int, float, long, short, 
unsigned, and near and far pointers are accepted. Additionaly, the types wchar (Unicode 
character) and tchar (Unicode in the NT version, OEM otherwise) are accepted. (Labels and macros 
are not legal.)
*	Nested structures, arrays and arrays of structures are legal. All arrays must have a fixed count except 
for strings which are described below. int[10] is legal int[] is not.
*	Null terminated strings (sz's) are the only variable length structures allowed. They are represented as 
an array of characters with no length: char[]
*	Fixed length strings are represented as arrays of characters with a fixed length: char[10]
*	Comments may be included in the file using standard c comment delimiters (/* */ and //) or by 
placing them after the pound symbol #.
*	Localizable types (types that need to be placed in token files) are indicated by all caps. Hence INT 
would generate a token while int would not.


The following is a sample RDF file:
#  This is a sample Resource Description File
<"type">
{
	int,	// no token will be generated for this integer
	CHAR	// this single-byte character will be placed in a token
}
<RCDATA>
{
	WCHAR[]  // a null terminated Unicode string that requires a token
	wchar[]  // no token will be generated for this Unicode string
}
<1000>
{
	TCHAR[],  // a null terminated Unicode or OEM string that requires
                // a token (Unicode if running NT version, else OEM).
	{
		int,
		FLOAT,	// localizable floating point value
		far *,
		CHAR[20]	// localizable 20 character single-byte string
	}[3],		// an array of three structures (NOT IMPLEMENTED YET)
	int
}
END			// Optional
 Throughout this document, the term localization refers to the process of preparing a product for an 
international market.  This process involves (among other things) translating text and resizing controls 
such as dialogs and buttons.  A person performing localization is referred to as a localizer.
 This document refers to a resource file as being any file that contains Windows resources.  This can be a 
.EXE file (or a .DLL, a .CPL, etc.), as well as a .RES file.  RLMan can use any of these files as resource 
files.
The Resource Localization Manager		Page 14