IBM Support

Maximo Language Files and Tables - Demystified

Technical Blog Post


Maximo Language Files and Tables - Demystified



Have you ever wondered how the translations in Maximo work ?      If your answer is no, you are probably reading the wrong blog and you may want to work more on searching techniques Eyebrow        If however the answer is yes, then please read on and I will hopefully unravel some of the mystery for you. 


Maximo translations for the numerous languages available are provided if XLIFF files.   A program called TDToolkit processes the files and creates tables and table entries which hold the translations along with pointers to the original text which is to be translated. 

Tables and their contents

Sometimes the beginning is not the best place to start, so Let's look at the tables involved first



     Base Language

The first thing to remember with Maximo is that you install it, and in so doing you create a Base Language.

The Base Language is recorded in the MAXVARS table. To find the Base Language use this SQL


It will provide a 2 character code for the Base Language in use  e.g.    EN   for English,  DE for German  etc

     Additional Languages

Installation of Base Language and also of additional languages creates rows in the LANGUAGE table.

To list all languages active on the system issue this SQL


Note - Issue the above SQL without the 'WHERE ENABLED='1' and you will get a list of all languages that are enabled or not.

     Language Version

Language version information is stored in the TDTVERSION table. There will be entries for each PMP / Language combination.

The version information is used by the TDToolkit program to allow further translations to be added without having to translate everything again. It can then just process the entries with a higher version number than that stored in the TDTVERSION table.

To check on version information for all entries for a language issue this SQL


Note – Change DE to any other 2 digit language code as required. The list of possible codes can be obtained from the LANGUAGE table

     Translation Tables

Installing an  additional language will cause a number of tables to be created or updated which have the prefix ‘L_’

These are the tables that store the actual translation text entries.

There will be one of these L_ translation tables for each existing table which has translations available

e.g.  L_ITEM will hold the translations for the ITEM table

e.g. L_MAXLABELS will hold the translations for the MAXLABELS table

Each L_xxxxxxxxx table will have a column called OWNERID

The number in the OWNERID field for each individual row will point to the the xxxxxID entry in the corresponding table for which it holds the translation




For this example, we will look at a Maximo implementation with Base Language of English and additional languages of German and Norwwegian (because I happen to have one I prepared earlier)


Output = EN             


Output=     Deutsch DE         English EN       Norsk NO      


Now, if we take a random row from the ITEM Table (and note I am not listing all fields here - just the ones that we are interested in for the example)

ITEMNUM=PMSC_2017A        DESCRIPTION=Firewall Change Requests     ITEMID=19

We can look at the L_ITEM table for rows where OWNERID=19  (as we know from above that the OWNERID points to the ITEMID or xxxxxxID if another table were used instead of ITEM)


In this instance 2 rows are returned (not all fields shown for clarity)


1.       OWNERID=19 LANGCODE=DE   DESCRIPTION=Requests bzgl. Firewall-Anderung


2.       OWNERID=19 LANGCODE=NO   DESCRIPTION=Foresporsler om brannmurendring


OK, now we know about the L_xxxxxx tables, lets look at the files that were used to populate the tables


Xliff files are not unique to Maximo as they are based on a OASIS open standard 


The xliff files are stored in separate directory structures based on the 2 character language code


e.g.  the core French files would be found under


Within this directory, there may also be subdirectories which store xliff files for PMPs

so in the above case, the XLIFF files for serviceprovider would be stored in 




The Maximo xliff file starts with some version information at the top for XML and xliff

 <?xml version="1.0" encoding='UTF-8'?>




<xliff version='1.1' xmlns='urn:oasis:names:tc:xliff:document:1.1' xmlns:sup='maximo'>


This is followed by a reference to the original file and the languages involved


(Note – A Maximo Xliff file will contain translations for only 1 language)




 <file original='MAXLABELS.xliff' source-language='en' target-language='no' datatype='plaintext'>




Next level down after the file information is the group. There can be one or more groups within the file





Within the group will be a sup:SourceInfo entry which identifies the Table used and the columns within it to look for the original source of information to translate.













The above example will use the MAXLABELS table and search on the 3 columns listed to locate the source information which is to be translated.


Within the group and after the sup:SourceInfo will be a number of trans-unit id entries.  Each unitid entry holds the 3 values to search on in the original table and provides the translation to write to the L_*******   tables

  <trans-unit id='100007' size-unit='char' maxwidth='4000'>









    <sup:Reference Type='Column'>VALUE</sup:Reference>




    <sup:Reference Type='DatabaseID'>LOOKUPS:pmcomjpnum_lookup_tablebody_col_9:label</sup:Reference>




    <sup:Reference Type='Comment'></sup:Reference>




    <sup:Reference Type='NotEscape'>0</sup:Reference>




    <sup:Reference Type='MLSupported'>1</sup:Reference>




    <sup:Reference Type='MLInUse'>1</sup:Reference>




    <sup:Reference Type='Version'>V7100-001</sup:Reference>








So.......   In the above example

we search the MAXLABELS table, for entries where 

APP=LOOKUPS     ID=pmcomjpnum_lookup_tablebody_col_9      PROPERTY=label

When we find matches, we write a translated data to the L_MAXLABELS table and make the OWNERID field point to the MAXLABELSID of the original row in the MAXLABELS table.   In this row, we set the VALUE filed to 'Aktivitet'     (from the target line above)   

It is also worth mentioning the version information here as this is stored in the TDTVERSION table.  This allows a reference to the latest version of updates made and so allows for subsequent updates to be added without re-translating everything   i.e. tell TDToolkit on a parameter only to make updates above a certain version number.



This is the tool that processes the XLIFF files and updates the table.    It has other functions which include (but is not limited to)

Installs language tables

Updates language tables

Sets/Alters Base Language

Exports translatable database entries to files - this allows for user created translations



   Example command

Add A Language

To add Multi Language functionality to the database, use the –ADDLANG[Lang_Code] flag, do not add a space between –ADDLANG and the Language code.

This will assume that the XLIFF files are under your {Maximo_Install}\tools\Maximo\{LangCode}\xliff directory.

e.g.      TDToolkit –addlangfr




This will import the French translations to the database.


If you want to learn more about TDToolkit and its functions, including other example commands, look within your Maximo file system for 



The End

If you liked the above (even if only a little), please click LIKE.     This is my first blog (hopefully of many) and I am told by those more 'social' than myself that to be liked by many is a good thing.  Apparently only your own dog liking you is not so good Grin


[{"Business Unit":{"code":"BU005","label":"IoT"}, "Product":{"code":"SSLKT6","label":"Maximo Asset Management"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":""}]