In response to recent messages asked for a "how-to" on script 
localization, hereis a quick write up on how to localize 
"messages" in ksh93 scripts.
An example is the 
best way to demonstate the process.  Assume we want to localizethe
 following very simple shell script called "demo" which is located in 
thesubdirectory "/work/msg":
   
#!/bin/ksh
   name="David"
  
 print  "Simple demonstration of  ksh93 message translation"  
 print  "Message locale is: $LC_MESSAGES"
   
echo   "Hello"   print  "Goodbye"   printf 
"Welcome %s\n" $name
   print  "This string is 
not translated because it is not in the message catalog"
  
 exit 0
The shell script is to be localized for
 French and Italian users so that they seethe strings enclose
 in double quotations (message strings) in their native language.
First
 we must rewrite the message strings in a format which the shell 
understandsto mean "translate this string if possible by 
retrieving the appropriate stringfrom a message catalog."
Here
 is the modified version of demo. It works just like the original 
version.
   #!/bin/ksh
  
 name="David"
   print  "Simple demonstration 
of  ksh93 message translation"   print  "Message locale is: 
$LC_MESSAGES"
   echo   $"Hello"   
print  $"Goodbye"   printf $"Welcome %s\n" $name
  
 print  $"This string is not translated because it is not in the message
 catalog"
   exit 0
The
 changes should be obvious, i.e. the use of $"...".
A
 decision has to be made as to where to place the localized message 
catalogs. Tokeep it simple the decision was to place them in a
 subdirectory under where theshell script is located. Thus 
the following directory structure was set up:
  
 /work/msg/demo   /work/msg/demo/locale   
/work/msg/demo/locale/C   /work/msg/demo/locale/fr  
 /work/msg/demo/locale/it

As an aside, AST-BASE supports the following locations 
for message catalogsby default:
  ${ROOT}/share/lib/locale/%l/%C/%N  ${ROOT}/share/locale/%l/%C/%N  
${ROOT}/lib/locale/%l/%C/%N
where
 ${ROOT} is the directory containing the shell script and %l,%C and %N 
havethe same meaning as when used with NLSPATH.  I choose not
 to use any of the defaultlocations for this example in order
 to demonstrate the use of NLSPATH.
Note the 
../locale/C subdirectory. It is mandatory to have a message catalog in 
thisdirectory - otherwise message localization does not work.
 The message strings inthis message catalog must be the same 
as the strings in your script. This messagecatalog is used to
 find the appropriate message string to retrieve from otherlocale
 message catalogs.
Code in libast 
(../libast/port/mg.c) compares the message string from the shellscript
 to all the message strings in this message catalog. If there is a 
match,the set and member numbers are used to quickly retrieve
 the corresponding messagestring from the appropriate locale 
message catalog if one exists.
Here is the
 C locale message file (demo.msg):
  $quote "  $set
 3  This is the C locale message set  1 "Hello"  2
 "Goodbye"  3 "Welcome %s\\n"
I 
assume you are familar with message files and catalogs in general so I 
am not going toexplain the syntax or layout of the above 
message file.  Note, however,  the use of 3 for the set 
number. This is mandatory for ksh93 shell scripts. It is hardcoded into 
ksh93.
Use the AST-BASE msggen utility to 
generate (compile) the corresponding messagecatalog:
  $
 msggen locale/C/demo.cat demo.msg
You do not 
need the .cat extension.  In fact you can call the catalog anythingyou
 like but the default is to expect the name of the message  catalog to 
be exactly the same as the name of the shell script. You can 
work  around this restriction to a certain extent by using 
NLSPATH.
In this case, we set NLSPATH to handle
 the .cat extension.
  $ 
NLSPATH=/work/msg/locale/%l/%N.cat; export NLSPATH
where
 %l is the language element and %N is the name parameter.
You
 can also use msggen to check the compiled message catalog:
  $
 msggen -l locale/C/demo.cat  $quote "  $set 3  1
 "Hello"  2 "Goodbye"  3 "Welcome %s\\n"
Here
 is the French message file (demo.fr.msg):
  $quote
 "  $set 3  This is the French locale message set  1
 "Bonjour"  2 "Au Revoir"  3 "Bienvenu %s\\n"
which
 is compiled into a French locale message catalog by:
  $
 msggen locale/fr/demo.cat demo.fr.msg
and here
 is the Italian message file (demo.fr.msg):
  $quote
 "  $set 3  This is the Italian locale message set  1
 "Ciao"  2 "Addio"  3 "Benvenuto %s\\n"
which
 is compiled into an Italian locale message catalog by:
  $
 msggen locale/it/demo.cat demo.it.msg
Now we 
are ready to test the localization of the demo script.
  $
 LC_MESSAGES=en_US.utf8; export LANG  $ ./demo  Simple
 demonstration of  ksh93 message translation  Message locale 
is: en_US.utf8  Hello  Goodbye  Welcome
 David  This string should not be translated because it is 
not in the message catalog
  $ 
LC_MESSAGES=fr_FR.utf8; export LANG  $ ./demo  Simple
 demonstration of  ksh93 message translation  Message locale 
is: fr_FR.utf8  Bonjour  Au Revoir  Bienvenu
 David  This string should not be translated because it is 
not in the message catalog
  $ 
LC_MESSAGES=it_IT.utf8; export LANG  $ ./demo  Simple
 demonstration of  ksh93 message translation  Message locale 
is: it_IT.utf8  Ciao  Addio  Benvenuto 
David  This string should not be translated because it is not
 in the message catalog
I hope this helps 
readers understand how to localize their ksh93 shell scripts. Iwill
 write up a better description of the process in my blog in the next few
 weeksbut this should be sufficient to get you started.
-
 Finnbarr
P.S.  Above example tested on version
 93t+.



                                          
_______________________________________________
ast-users mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-users

Reply via email to