IBM Support

Maximo Language Files and Tables - Demystified

Technical Blog Post


Abstract

Maximo Language Files and Tables - Demystified

Body

Introduction

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. 

Overview

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

SELECT VARVALUE FROM MAXVARS WHERE VARNAME='BASELANGUAGE';

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

SELECT LANGUAGENAME,MAXLANGCODE from LANGUAGE WHERE ENABLED='1';

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

SELECT PMPNAME,VERSION FROM TDTVERSION WHERE LANGUAGE=‘DE’;

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

e.g.     ITEMID      MAXLABELSID    COMPANYID  etc

 

     Example

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)

SELECT VARVALUE FROM MAXVARS WHERE VARNAME='BASELANGUAGE';

Output = EN             

SELECT LANGUAGENAME,MAXLANGCODE from LANGUAGE WHERE ENABLED='1';

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)

SELECT * FROM L_ITEM WHERE OWNERID=’19’;

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

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

   Location

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

{maximo_install}\tools\maximo\{LANG_CODE}\xliff

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

{maximo_install}\tools\maximo\fr\xliff

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 

{maximo_install}\tools\maximo\fr\xliff\serviceprovider

 

     Format

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

 

<group>

 

 

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.

   <sup:SourceInfo>

 

 

    <sup:Table>MAXLABELS</sup:Table>

 

 

    <sup:ID-col>APP:ID:PROPERTY</sup:ID-col>

 

 

   </sup:SourceInfo>

 

 

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'>

   <source>Activity</source>

 

 

 

    <target>Aktivitet</target>

 

 

 

    <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>

 

 

 

   </trans-unit>

 

 

 

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.

 

TDToolkit

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 

\maximo\tools\maximo\classes\psdi\xlate\TDToolkit_Overview.doc

 

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":""}]

UID

ibm11133073