(file) Return to Globalization_HOWTO.htm CVS log (file) (dir) Up to [Pegasus] / pegasus / doc

Diff for /pegasus/doc/Globalization_HOWTO.htm between version 1.5 and 1.12

version 1.5, 2003/10/13 21:18:22 version 1.12, 2008/12/18 16:41:52
Line 8 
Line 8 
 </head> </head>
 <body text="#000000" bgcolor="#ffffff" link="#0000ef" vlink="#55188a" <body text="#000000" bgcolor="#ffffff" link="#0000ef" vlink="#55188a"
  alink="#ff0000">  alink="#ff0000">
 <center><font size="+4">Globalization HOWTO</font>  <center>
   <p><big><big><big>Globalization HOWTO</big></big></big></p>
 <p>Release: Pegasus 2.3 </p> <p>Release: Pegasus 2.3 </p>
 <p>Author: Chuck Carmack (carmack@us.ibm.com) </p> <p>Author: Chuck Carmack (carmack@us.ibm.com) </p>
 <p>July 28, 2003</p>  <p>December 1, 2003</p>
 </center> </center>
 <p><br> <p><br>
   Change History:<br>
   </p>
   <table cellpadding="2" cellspacing="2" border="1"
    style="text-align: left; width: 100%; margin-left: auto; margin-right: auto;">
     <tbody>
       <tr>
         <td style="vertical-align: top;">01/12/03<br>
         </td>
         <td style="vertical-align: top;">carmack<br>
         </td>
         <td style="vertical-align: top;">Section 2.2.2. &nbsp;Changed how
   the package name parameter should be used. &nbsp;It should no longer be
   used as part of the table name inside the bundle.<br>
         </td>
       </tr>
       <tr>
         <td style="vertical-align: top;">08/04/06<br>
         </td>
         <td style="vertical-align: top;">Marek Szermutzky<br>
         </td>
         <td style="vertical-align: top;">Section 2.2.5. &nbsp; Added information how to write platform specific messages.<br>
         </td>
       </tr>
       <tr>
         <td style="vertical-align: top;">01/23/07<br>
         </td>
         <td style="vertical-align: top;">Sushma Fernandes<br>
         </td>
         <td style="vertical-align: top;">Section 2.2.5. &nbsp; Added information on special considerations while creating a new message.<br>
         </td>
       </tr>
     </tbody>
   </table>
   <p><br>
 </p> </p>
 <h2> 1.0 Introduction</h2> <h2> 1.0 Introduction</h2>
 <p><br> <p><br>
Line 25 
Line 60 
 locale-neutral.&nbsp; In other words, the program should be able to run locale-neutral.&nbsp; In other words, the program should be able to run
 in any locale without change.&nbsp; There are several categories in a in any locale without change.&nbsp; There are several categories in a
 locale, including the language of message strings, date format, time locale, including the language of message strings, date format, time
 format, etc.&nbsp; For release 2.3, the Pegasus server is concerned  format, etc.&nbsp; For release 2.3, the Pegasus server is concerned with
 with the language of the message strings it returns to its clients. <br>  the language of the message strings it returns to its clients. <br>
 &nbsp; </p> &nbsp; </p>
 <p>To support internationalization, a program is designed to do the <p>To support internationalization, a program is designed to do the
 following: <br> following: <br>
Line 39 
Line 74 
 and usually has converters on the platform, it is a good choice for the and usually has converters on the platform, it is a good choice for the
 'normalized' internal character set.&nbsp;&nbsp;&nbsp; The most 'normalized' internal character set.&nbsp;&nbsp;&nbsp; The most
 'interoperable' solution for external data is to support UTF-8 (eg. 'interoperable' solution for external data is to support UTF-8 (eg.
 network and file system data).&nbsp; The internal data is usually  network and file system data).&nbsp; The internal data is usually UTF-16
 UTF-16 (or UCS-2, but that is deprecated).</li>  (or UCS-2, but that is deprecated).</li>
   <br>   <br>
 &nbsp; <li> Extract locale-sensitive resources, such as message &nbsp; <li> Extract locale-sensitive resources, such as message
 strings, from the code to external resource files.&nbsp; Typically, the strings, from the code to external resource files.&nbsp; Typically, the
Line 79 
Line 114 
 files.</li> files.</li>
   <br>   <br>
 &nbsp; <li> APIs were added for clients to associate a language with &nbsp; <li> APIs were added for clients to associate a language with
 the CIM objects they are sending to Pegasus.&nbsp; Also, APIs were  the CIM objects they are sending to Pegasus.&nbsp; Also, APIs were added
 added for clients to determine the language of the error message or CIM  for clients to determine the language of the error message or CIM
 object that Pegasus returns.</li> object that Pegasus returns.</li>
   <br>   <br>
 &nbsp; <li> APIs were added for providers to determine the language of &nbsp; <li> APIs were added for providers to determine the language of
 CIM objects sent by the client.&nbsp; Also, APIs were added for CIM objects sent by the client.&nbsp; Also, APIs were added for
 providers to associate a language with the CIM object, or error  providers to associate a language with the CIM object, or error message,
 message, they return to the client.</li>  they return to the client.</li>
 </ul> </ul>
 <p><br> <p><br>
 Please refer to PEPs 56 and 58 for details about the globalization Please refer to PEPs 56 and 58 for details about the globalization
Line 137 
Line 172 
   <li> The Pegasus 2.2 methods that take a char *, or return char *, are   <li> The Pegasus 2.2 methods that take a char *, or return char *, are
 unchanged.&nbsp; Code written to Pegasus 2.2 may have expected to store unchanged.&nbsp; Code written to Pegasus 2.2 may have expected to store
 8-bit ASCII (ISO-8859-1) characters into String.&nbsp; These methods 8-bit ASCII (ISO-8859-1) characters into String.&nbsp; These methods
 will convert the input to UTF-16 from 8-bit ASCII.&nbsp; (This is  will convert the input to UTF-16 from 8-bit ASCII.&nbsp; (This is simple
 simple because UTF-16 is a superset of 8-bit ASCII - simply need to  because UTF-16 is a superset of 8-bit ASCII - simply need to prepend
 prepend '\0' to each char).&nbsp; The Pegasus 2.2 methods that return  '\0' to each char).&nbsp; The Pegasus 2.2 methods that return char data
 char data will attempt to convert from the UTF-16 internal  will attempt to convert from the UTF-16 internal representation to
 representation to 8-bit ASCII.&nbsp; Characters that cannot be  8-bit ASCII.&nbsp; Characters that cannot be converted will be replaced
 converted will be replaced with a substitution character.</li>  with a substitution character.</li>
   <br>   <br>
 &nbsp; <li> All methods that take or return Char16 data are &nbsp; <li> All methods that take or return Char16 data are
 unchanged.&nbsp; The String class now supports UTF-16 data in Char16, unchanged.&nbsp; The String class now supports UTF-16 data in Char16,
 although surrogate pairs will require two consecutive Char16 although surrogate pairs will require two consecutive Char16
 objects.&nbsp; The String class does NO checking for unmatched  objects.&nbsp; The String class does NO checking for unmatched surrogate
 surrogate pairs.</li>  pairs.</li>
   <br>   <br>
 &nbsp; <li> New methods have been added to take and return UTF-8 &nbsp; <li> New methods have been added to take and return UTF-8
 data.&nbsp; The String class will convert between UTF-8 and the UTF-16 data.&nbsp; The String class will convert between UTF-8 and the UTF-16
 internal representation as needed.&nbsp; These new methods will use  internal representation as needed.&nbsp; These new methods will use char
 char * parameters, but will be clearly labelled as UTF-8 methods.</li>  * parameters, but will be clearly labelled as UTF-8 methods.</li>
   <br>   <br>
 &nbsp; &nbsp;
 </ul> </ul>
Line 162 
Line 197 
 superset of 8-bit ASCII.&nbsp; Any String object containing EBCDIC data superset of 8-bit ASCII.&nbsp; Any String object containing EBCDIC data
 will not work if it is used by Pegasus to read or write data from will not work if it is used by Pegasus to read or write data from
 external sources, such as the network or repository files.&nbsp; In external sources, such as the network or repository files.&nbsp; In
 other words, any String containing EBCDIC data should not leave the  other words, any String containing EBCDIC data should not leave the code
 code using it. <br>  using it. <br>
 &nbsp; <br> &nbsp; <br>
 &nbsp; &nbsp;
 <h3> 2.2 Localization Support</h3> <h3> 2.2 Localization Support</h3>
Line 202 
Line 237 
 &nbsp; </p> &nbsp; </p>
 <p>CIM clients may use the Accept-Language HTTP header to specify the <p>CIM clients may use the Accept-Language HTTP header to specify the
 languages they wish to be returned in the CIM response message.&nbsp; languages they wish to be returned in the CIM response message.&nbsp;
 CIM clients may also use the Content-Language header to tag the  CIM clients may also use the Content-Language header to tag the language
 language of any CIM objects they are sending to the server in the CIM  of any CIM objects they are sending to the server in the CIM request
 request message.&nbsp; The server, and providers, should attempt to  message.&nbsp; The server, and providers, should attempt to return
 return error messages and CIM objects in one of the accept languages  error messages and CIM objects in one of the accept languages requested
 requested by the client.&nbsp; The server and providers should set the  by the client.&nbsp; The server and providers should set the
 Content-Language header in the CIM response message to indicate which  Content-Language header in the CIM response message to indicate which of
 of the requested languages they are returning. <br>  the requested languages they are returning. <br>
 &nbsp; </p> &nbsp; </p>
 <p>NOTE:&nbsp; Localization support was not added for the MOF files and <p>NOTE:&nbsp; Localization support was not added for the MOF files and
 repository in Pegasus 2.3.&nbsp; The #pragma locale, #pragma repository in Pegasus 2.3.&nbsp; The #pragma locale, #pragma
Line 217 
Line 252 
 classes, qualifiers, and instances stored in the repository are not classes, qualifiers, and instances stored in the repository are not
 tagged with a language.&nbsp; The Accept-Language and Content-Language tagged with a language.&nbsp; The Accept-Language and Content-Language
 headers will be ignored for repository operations.&nbsp; However, since headers will be ignored for repository operations.&nbsp; However, since
 the repository will support UTF-8,&nbsp; characters for any language  the repository will support UTF-8,&nbsp; characters for any language may
 may be stored there. <br>  be stored there. <br>
 &nbsp; </p> &nbsp; </p>
 <p>NOTE:&nbsp; Since the Content-Language header applies to the entire <p>NOTE:&nbsp; Since the Content-Language header applies to the entire
 HTTP message, it applies to the entire CIM-XML document.&nbsp; This HTTP message, it applies to the entire CIM-XML document.&nbsp; This
Line 227 
Line 262 
 remain until the CIM standard has been updated to support language tags remain until the CIM standard has been updated to support language tags
 tied to individual CIM values.&nbsp; From the client perspective, it is tied to individual CIM values.&nbsp; From the client perspective, it is
 possible for Pegasus to send a CIM response with NO Content-Language, possible for Pegasus to send a CIM response with NO Content-Language,
 even if the client had sent Accept-Language.&nbsp;&nbsp; This can  even if the client had sent Accept-Language.&nbsp;&nbsp; This can happen
 happen if Pegasus does not know the language of the response.&nbsp; An  if Pegasus does not know the language of the response.&nbsp; An example
 example is a request that was sent to a Pegasus 2.2 provider.&nbsp;  is a request that was sent to a Pegasus 2.2 provider.&nbsp; Another
 Another example is an enumerated response where each provider returned  example is an enumerated response where each provider returned a
 a different language.&nbsp; Please refer to PEP58 for details on these  different language.&nbsp; Please refer to PEP58 for details on these
 provider scenarios. <br> provider scenarios. <br>
 &nbsp; </p> &nbsp; </p>
 <p>Pegasus 2.3 has added classes for the localization support.&nbsp;  <p>
 There are new classes called AcceptLanguages and ContentLanguages that  The Accept-Language and Content-Language headers are encapsulated
 encapsulate the Accept-Language and Content-Language headers,  in AcceptLanguageList and ContentLanguageList classes, respectively.
 respectively.&nbsp; These classes are basically containers of  These classes contain LanguageTag objects.  The AcceptLanguageList class
 AcceptLanguageElement and ContentLanguageElement, where a language  keeps its LanguageTags prioritized based on quality,
 element represents one language tag.&nbsp; The AcceptLanguages class  
 will keep the AcceptLanguageElement's prioritized based on quality,  
 according to RFC 2616. <br> according to RFC 2616. <br>
 &nbsp; </p> &nbsp; </p>
 <p>AcceptLanguages and ContentLanguages are the objects used by code  <p>AcceptLanguageList and ContentLanguageList are the objects used by code
 throughout the request/response processing, from the client to the throughout the request/response processing, from the client to the
 server to the providers and back.&nbsp; The server handles the creation server to the providers and back.&nbsp; The server handles the creation
 of these objects from the HTTP headers.&nbsp; Code at each point in the of these objects from the HTTP headers.&nbsp; Code at each point in the
 process will have access to these objects. <br> process will have access to these objects. <br>
 &nbsp; </p> &nbsp; </p>
 <p>Please refer to the following files for details on the new Pegasus  <p>Please refer to the following files for details on the Pegasus
 classes. <br>  language interfaces.<br>
 &nbsp; </p> &nbsp; </p>
 <ul> <ul>
   <li> pegasus/src/Pegasus/Common/AcceptLanguages.h</li>    <li> pegasus/src/Pegasus/Common/AcceptLanguageList.h</li>
   <li> pegasus/src/Pegasus/Common/AcceptLanguageElement.h</li>    <li> pegasus/src/Pegasus/Common/ContentLanguageList.h</li>
   <li> pegasus/src/Pegasus/Common/ContentLanguages.h</li>    <li> pegasus/src/Pegasus/Common/LanguageTag.h</li>
   <li> pegasus/src/Pegasus/Common/ContentLanguageElement.h</li>  
   <li> pegasus/src/Pegasus/Common/LanguageElementContainer.h</li>  
   <li> pegasus/src/Pegasus/Common/LanguageElement.h</li>  
 </ul> </ul>
 <p><br> <p><br>
 See the sections below for details on how to write clients and See the sections below for details on how to write clients and
Line 290 
Line 320 
  href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource  href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource
 Management</a>&nbsp; section of the <a Management</a>&nbsp; section of the <a
  href="http://oss.software.ibm.com/icu/userguide/">ICU User Guide</a>  href="http://oss.software.ibm.com/icu/userguide/">ICU User Guide</a>
 .&nbsp; This section will tell you how to <br>  .&nbsp; This section will tell you how to create and organize your
 create and organize your resource bundles for different  resource bundles for different languages.&nbsp; Note:&nbsp; your
 languages.&nbsp; Note:&nbsp; your resource bundles should be organized  resource bundles should be organized in a tree structure similiar to
 in a tree structure similiar to the one shown in the Resource  the one shown in the Resource Management section, including the empty
 Management section, including the empty bundles in the tree.&nbsp; It  bundles in the tree.&nbsp;<br>
 is recommended that you ship a root resource bundle to be used as the  </p>
 fallback in case the client requests a language that you are not  <p><br>
   It is recommended that you ship a root resource bundle to be used as
   the fallback in case the client requests a language that you are not
 supporting.&nbsp; The Pegasus make files are set up to automatically supporting.&nbsp; The Pegasus make files are set up to automatically
 create and compile a root resource bundle for you.&nbsp; For Pegasus create and compile a root resource bundle for you.&nbsp; For Pegasus
 2.3, the make will use your "en" bundle, upper case all the messages, 2.3, the make will use your "en" bundle, upper case all the messages,
 and then put the uppercased messages into the root bundle.&nbsp; The and then put the uppercased messages into the root bundle.&nbsp; The
 uppercasing of the messages is necessary to create a "fallback" root uppercasing of the messages is necessary to create a "fallback" root
 bundle that contains invariant characters across all EBCIC and  bundle that contains invariant characters across all EBCDIC and
 ASCII&nbsp;codepages. <br> ASCII&nbsp;codepages. <br>
 &nbsp; </p> &nbsp; </p>
 <p>NOTE:&nbsp; When creating your resource bundles, the name of the <p>NOTE:&nbsp; When creating your resource bundles, the name of the
 table resource should contain the package name.&nbsp;&nbsp;&nbsp; For  table resource should <span style="font-style: italic;">not</span>
 example, if you have a bundle with a package name of "xyz", then the  contain the package name.&nbsp;&nbsp;&nbsp; For example, if you <br>
 "en" bundle should start like this: </p>  have a bundle with a package name of "xyz", then the "en" bundle should
 <p>xyz_en:table { <br>  start like this: </p>
   <p><br>
   en:table { <br>
 ..... messages here <br> ..... messages here <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 } <br>  }</p>
 &nbsp; </p>  
 <p><i>not</i> like this: </p> <p><i>not</i> like this: </p>
 <p>en:table { <br>  <p>xyz_en:table { <br>
 ..... messages here <br> ..... messages here <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 } </p>  } <br>
 <p>This is different than some of the examples in the <a  &nbsp; <br>
  href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource  </p>
 Management</a> section, but is needed because the -p option is not used  <p>This is needed because the package name (-p) option is used by the
 on genrb by the make files. <br>  Pegasus make files on the call to genrb. <br>
 &nbsp; </p> &nbsp; </p>
 <p>NOTE:&nbsp; Pegasus 2.3 only supports simple string resources in the <p>NOTE:&nbsp; Pegasus 2.3 only supports simple string resources in the
 ICU resource bundles.&nbsp; String resources may only be loaded by ICU resource bundles.&nbsp; String resources may only be loaded by
Line 360 
Line 393 
 <p><br> <p><br>
 Code that needs to load a message in Pegasus does not call ICU Code that needs to load a message in Pegasus does not call ICU
 directly.&nbsp; Two message loading classes were added for Pegasus directly.&nbsp; Two message loading classes were added for Pegasus
 2.3:&nbsp; MessageLoader and MessageLoaderParms.&nbsp; These classes  2.3:&nbsp; MessageLoader and MessageLoaderParms.&nbsp; These classes are
 are abstractions designed to hide of the actual loader used (but note  abstractions designed to hide of the actual loader used (but note that
 that at the time of writing, only ICU is supported).&nbsp;&nbsp; The  at the time of writing, only ICU is supported).&nbsp;&nbsp; The
 MessageLoader is used to load a message using a list of preferrred MessageLoader is used to load a message using a list of preferrred
 languages.&nbsp; The parameters to MessageLoader are encapsulated in a languages.&nbsp; The parameters to MessageLoader are encapsulated in a
 MessageLoaderParms object. <br> MessageLoaderParms object. <br>
 &nbsp; </p> &nbsp; </p>
 <p>The MessageLoader is the place where the Accept-Language header, <p>The MessageLoader is the place where the Accept-Language header,
 Content-Language header, and the ICU resource bundles, join up.&nbsp; Content-Language header, and the ICU resource bundles, join up.&nbsp;
 The MessageLoader class is designed to receive an AcceptLanguages  The MessageLoader class is designed to receive an AcceptLanguageList
 object, and a set of parameters indicating the bundle base-name and object, and a set of parameters indicating the bundle base-name and
 message ID to use.&nbsp; The AcceptLanguages object contains the list  message ID to use.&nbsp; The AcceptLanguageList object contains the list of
 of requested languages sent by the client.&nbsp; The MessageLoader  requested languages sent by the client.&nbsp; The MessageLoader
 searches for the message in the set of bundles named with the  searches for the message in the set of bundles named with the base-name,
 base-name, using the AcceptLanguages for the list of specific  using the AcceptLanguageList for the list of specific translated bundles
 translated bundles to search.&nbsp; The MessageLoader returns the  to search.&nbsp; The MessageLoader returns the message that it found,
 message that it found, along with a ContentLanguages object indicating  along with a ContentLanguageList object indicating the language of the
 the language of the message.&nbsp; The ContentLanguages object should  message.&nbsp; The ContentLanguageList object should be used to indicate
 be used to indicate the language of the response sent back to the  the language of the response sent back to the client. <br>
 client. <br>  
 &nbsp; </p> &nbsp; </p>
 <p>The MessageLoaderParms object contains the parameters to load the <p>The MessageLoaderParms object contains the parameters to load the
 message.&nbsp; There are many parameters, but many can be allowed to message.&nbsp; There are many parameters, but many can be allowed to
Line 411 
Line 443 
       <td>Input.&nbsp; <br>       <td>Input.&nbsp; <br>
 Optional <br> Optional <br>
 Default: $PEGASUS_HOME/msg/pegasus/pegasusServer</td> Default: $PEGASUS_HOME/msg/pegasus/pegasusServer</td>
       <td>Path to the root resource bundle file which contains the        <td>Path to the resource bundle file which contains the
 msg_id.&nbsp; <br> msg_id.&nbsp; <br>
 Note: Only specify the path down to the bundle base-name.&nbsp; Do not Note: Only specify the path down to the bundle base-name.&nbsp; Do not
 append a language tag, such as "_root" or "_en".&nbsp; Do not append a append a language tag, such as "_root" or "_en".&nbsp; Do not append a
Line 420 
Line 452 
 Note: defaults to the bundle containing the Pegasus server messages.</td> Note: defaults to the bundle containing the Pegasus server messages.</td>
     </tr>     </tr>
     <tr>     <tr>
       <td>AcceptLanguages acceptlanguages;</td>        <td>AcceptLanguageList acceptlanguages;</td>
       <td>Input.&nbsp; <br>       <td>Input.&nbsp; <br>
 Optional <br> Optional <br>
 Default: AcceptLanguages::EMPTY</td>  Default: AcceptLanguageList()</td>
       <td>Contains the list of preferred languages, in priority       <td>Contains the list of preferred languages, in priority
 order.&nbsp; This is combined with msg_src_path to determine which order.&nbsp; This is combined with msg_src_path to determine which
 resource bundles to search for for the msg_id.&nbsp;&nbsp; If not  resource bundles to search for for the msg_id.&nbsp;&nbsp; If not empty,
 empty, overrides useThreadLocale and useProcessLocale.</td>  overrides useThreadLocale and useProcessLocale.</td>
     </tr>     </tr>
     <tr>     <tr>
       <td>ContentLanguages contentlanguages;</td>        <td>ContentLanguageList contentlanguages;</td>
       <td>Output</td>       <td>Output</td>
       <td>Contains the language that MessageLoader found for the       <td>Contains the language that MessageLoader found for the
 msg_id.&nbsp;</td> msg_id.&nbsp;</td>
Line 448 
Line 480 
       <td>Input <br>       <td>Input <br>
 Optional <br> Optional <br>
 Default = <font color="#ff0000">true</font></td> Default = <font color="#ff0000">true</font></td>
       <td>If true, MessageLoader will use the AcceptLanguages set by        <td>If true, MessageLoader will use the AcceptLanguageList set by
 Pegasus into the caller's Thread.&nbsp;&nbsp; See the Note below for Pegasus into the caller's Thread.&nbsp;&nbsp; See the Note below for
 details.&nbsp;</td> details.&nbsp;</td>
     </tr>     </tr>
     <tr>     <tr>
       <td>Boolean useICUfallback</td>  
       <td>Input <br>  
 Optional <br>  
 Default = false</td>  
       <td>If true, use ICU's fallback mechnism to search more general  
 resource bundles if the msg_id cannot be found.&nbsp; Note: the  
 recommended setting is false if you are using an AcceptLanguages from a  
 CIM client.&nbsp; The Accept-Languages HTTP header from the client  
 contains the fallback specifications.</td>  
     </tr>  
     <tr>  
       <td>Formatter::Arg arg0; <br>       <td>Formatter::Arg arg0; <br>
 &nbsp;Formatter::Arg arg1; <br> &nbsp;Formatter::Arg arg1; <br>
 &nbsp;Formatter::Arg arg2; <br> &nbsp;Formatter::Arg arg2; <br>
Line 486 
Line 507 
 <p>Notes: <br> <p>Notes: <br>
 &nbsp; </p> &nbsp; </p>
 <p>The "useThreadLocale" parameter defaults to true.&nbsp; This flag <p>The "useThreadLocale" parameter defaults to true.&nbsp; This flag
 indicates to use the AcceptLanguages object set by Pegasus into the  indicates to use the AcceptLanguageList object set by Pegasus into the
 Pegasus Thread in which the caller's code is running.&nbsp; This Pegasus Thread in which the caller's code is running.&nbsp; This
 AcceptLanguages object reflects the languages requested by the  AcceptLanguageList object reflects the languages requested by the
 client.&nbsp; This is useful for code that may not have access to the client.&nbsp; This is useful for code that may not have access to the
 AcceptLanguages from the client.&nbsp; Pegasus sets this  AcceptLanguageList from the client.&nbsp; Pegasus sets this AcceptLanguageList
 AcceptLanguages object into the Thread of providers and internal  object into the Thread of providers and internal Pegasus code.&nbsp;
 Pegasus code.&nbsp; For this reason, it is recommended that provider  For this reason, it is recommended that provider and internal Pegasus
 and internal Pegasus code use the "useThreadLocale" flag instead of  code use the "useThreadLocale" flag instead of explicity passing in an
 explicity passing in an AcceptLanguages object.&nbsp; See the Provider  AcceptLanguageList object.&nbsp; See the Provider Developer and Pegasus
 Developer and Pegasus Developer sections for details. <br>  Developer sections for details. <br>
 &nbsp; </p> &nbsp; </p>
 <p>The "useProcessLocale" flag can be used to tell MessageLoader to use <p>The "useProcessLocale" flag can be used to tell MessageLoader to use
 the default locale of the process, as determined by ICU.&nbsp; This is the default locale of the process, as determined by ICU.&nbsp; This is
 useful for situations where the caller is not localizing for a client useful for situations where the caller is not localizing for a client
 request.&nbsp; The caller may itself be a client (eg. cimconfig), or  request.&nbsp; The caller may itself be a client (eg. cimconfig), or may
 may need to log messages to the system log in the locale of the Pegasus  need to log messages to the system log in the locale of the Pegasus
 server process.&nbsp; See the CLI Messages and Logger Messages sections server process.&nbsp; See the CLI Messages and Logger Messages sections
 below. <br> below. <br>
 &nbsp; </p> &nbsp; </p>
 <p>"Master switch" <br> <p>"Master switch" <br>
 The MessageLoader class has a public static Boolean variable called The MessageLoader class has a public static Boolean variable called
 _useProcessLocale that may be used to override all the AcceptLanguages  _useProcessLocale that may be used to override all the AcceptLanguageList
 and useThreadLocale settings in the MessageLoaderParms objects passed and useThreadLocale settings in the MessageLoaderParms objects passed
 in.&nbsp; This is useful for CLI code (eg cimconfig) that needs to in.&nbsp; This is useful for CLI code (eg cimconfig) that needs to
 localize its messages based on the locale of its process, which refects localize its messages based on the locale of its process, which refects
 the locale set by the user running the CLI (eg. $LANG on Unix).&nbsp; the locale set by the user running the CLI (eg. $LANG on Unix).&nbsp;
 The CLI code may call Pegasus APIs that are coded to use the Thread's The CLI code may call Pegasus APIs that are coded to use the Thread's
 AcceptLanguages, which will not be set in this case.&nbsp; The  AcceptLanguageList, which will not be set in this case.&nbsp; The
 _useProcessLocale static variable tells the MessageLoader to ignore the _useProcessLocale static variable tells the MessageLoader to ignore the
 AcceptLanguages, useThreadLocale, and useProcessLocale settings in  AcceptLanguageList, useThreadLocale, and useProcessLocale settings in
 MessageLoaderParms that it gets.&nbsp; The MessageLoader will use the MessageLoaderParms that it gets.&nbsp; The MessageLoader will use the
 default process locale, as determined by ICU, in this case. <br> default process locale, as determined by ICU, in this case. <br>
 &nbsp; </p> &nbsp; </p>
 <p><i>Important Note:</i>&nbsp; The MessageLoader defaults to <i>not </i>use  <p><i>Important Note:</i>&nbsp; The MessageLoader does <i>not</i> use
 the "fallback" mechanism described in the ICU Resource Management the "fallback" mechanism described in the ICU Resource Management
 section.&nbsp; This is because the Accept-Language header itself section.&nbsp; This is because the Accept-Language header itself
 describes the fallback that the client wants.&nbsp; However, the  describes the fallback that the client wants.&nbsp; If the
 MessageLoader does "fallback" to the root resource bundle if none of  MessageLoader cannot find a message file for any of the languages
 the languages in AcceptLanguages can be found.&nbsp; If the root  in the AcceptLanguageList, it will try the default process locale.
 resource bundle cannot be found, then the default_msg is  If this fails, the ICU root resource bundle will be tried.<br>
 returned.&nbsp; The "useICUFallback" flag can be set to have  
 MessageLoader use ICU fallback on all message load attempts.&nbsp;  
 However, usage of this flag for client requests may lead to incorrect  
 results.&nbsp; For example, a client sets Accept-Language to french,  
 german, and spanish, in that order, but there is no french resource  
 bundle.&nbsp; A call to MessageLoader with useICUfallback == true would  
 cause the root resource bundle string to be returned on the attempt to  
 load from the french bundle.&nbsp; But the client requested german to  
 be the fallback after french. <br>  
 &nbsp; </p> &nbsp; </p>
 <p>Please refer to the following files for details on the new Pegasus <p>Please refer to the following files for details on the new Pegasus
 classes. <br> classes. <br>
Line 548 
Line 560 
 classes described above.&nbsp; Note: this a generic example.&nbsp; Each classes described above.&nbsp; Note: this a generic example.&nbsp; Each
 of the developer sections below have 'real-life' examples that are of the developer sections below have 'real-life' examples that are
 better suited to each type of code. </p> better suited to each type of code. </p>
 <p>// Build an AcceptLanguages with some language elements <br>  <p>// Build an AcceptLanguageList with some language elements <br>
 AcceptLanguages acceptLangs; <br>  AcceptLanguageList acceptLangs; <br>
 acceptLangs.add(AcceptLanguageElement("fr", 0.5)); <br>  acceptLangs.insert(LanguageTag("fr"), 0.5); <br>
 acceptLangs.add(AcceptLanguageElement("de", 0.8)); <br>  acceptLangs.insert(LanguageTag("de"), 0.8); <br>
 acceptLangs.add(AcceptLanguageElement("es", 0.4)); </p>  acceptLangs.insert(LanguageTag("es"), 0.4); </p>
 <p>// Construct a MessageLoaderParms <br> <p>// Construct a MessageLoaderParms <br>
 MessageLoaderParms parms("msgID", "default message"); <br> MessageLoaderParms parms("msgID", "default message"); <br>
 parms. msg_src_path = "/my_msg_dir/my_bundle"; <br> parms. msg_src_path = "/my_msg_dir/my_bundle"; <br>
Line 562 
Line 574 
 String localizedMsg = MessageLoader::getMessage(parms); <br> String localizedMsg = MessageLoader::getMessage(parms); <br>
 &nbsp; <br> &nbsp; <br>
 &nbsp; </p> &nbsp; </p>
 <h4> 2.2.4 Message Writing Guidelines</h4>  <h4> 2.2.5 Message Writing Guidelines</h4>
 <p><br> <p><br>
 Here are some basic rules for writing messages: <br> Here are some basic rules for writing messages: <br>
 &nbsp; </p> &nbsp; </p>
 <ul> <ul>
   <li> If you want to claim that you are globalized, no hardcoded   <li> If you want to claim that you are globalized, no hardcoded
 messages!</li> messages!</li>
   <li> Avoid combining messages in the code from other messages.&nbsp;    <li> Avoid creating a message in the code by combining other
 When you do this you are assuming that you know the grammar for every  messages.&nbsp; When you do this you are assuming that you know the
 language.</li>  grammar for every language.</li>
   <li> String substitutions into messages are generally untranslated,   <li> String substitutions into messages are generally untranslated,
 ie. not loaded from the resource bundle.&nbsp;&nbsp; Example: a file ie. not loaded from the resource bundle.&nbsp;&nbsp; Example: a file
 name.</li> name.</li>
Line 581 
Line 593 
 ultimately the customer.</li> ultimately the customer.</li>
   <li> <b>TODO </b>- find a good message writing guide to link to</li>   <li> <b>TODO </b>- find a good message writing guide to link to</li>
 </ul> </ul>
   
   <p><b>When do I create a new message ?</b></p>
   
   <p>A new message should be created if a message is needed with a content not
   described by any existing message.</p>
   
   <p>A new message should be created if the number or placement of substitution
   parameters of an existing message would require an update.</p>
   
   <p>It is not necessary to create a new message if just the text of the message
   is changed, while the meaning is kept. For instance if the
   event(error,warning,whatever) is described more precisely by the new message
   text, it is not necessary to create a new message, but the existing one should
   be updated.</p>
   
   <p><b>Are there any special considerations while creating a new message ? </b></p>
   
   <ul>
   <li>If a message definition contains text within a single quote
   it is not interpreted in any way.
   
   <p><i>Example:</i></p>
   <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
       string {"PGS05202: User '{0}' is not authorized to access CIM data."}
   </p>
   
   <p><i>Processed message:</i></p>
   <p>  User {0} is not authorized to access CIM data.  </p>
   </li>
   
   <li> For a single quote to appear in a processed message, it needs to be preceded by
   another single quote.
   
   <p><i>Example:</i></p>
   <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
       string {"PGS05202: User ''{0}'' is not authorized to access CIM data."}
   </p>
   
   <p><i>Processed message:</i></p>
   <p>  User 'wbemuser' is not authorized to access CIM data.  </p>
   </li>
   
   <li> For a double quote to appear in a processed message, it needs to be preceded by
   a back slash.
   
   <p><i>Example:</i></p>
   <p>
   ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.
   UNSUPPORTED_USERCONTEXT_VALUE:string {"PGS03029: Unsupported UserContext
   value: \"{0}\"."}
   </p>
   
   <p><i>Processed message:</i></p>
   <p>  Unsupported UserContext value: "10".  </p>
   </li>
   </ul>
   
   <p>&nbsp;</p>
   
   <p><b>How do I write a platform specific
   message ? </b></p>
   
   <p>Platform specific messages generate in a non-platform specific source file
   should be formatted with a .&lt;platform&gt; or .STANDARD suffix.</p>
   
   <p><i>Example:</i></p>
   <p>Compiler.cmdline.cimmof.cmdline.MENU.PEGASUS_OS_HPUX</p>
   <p>Compiler.cmdline.cimmof.cmdline.MENU.PEGASUS_OS_OS40</p>
   <p>Compiler.cmdline.cimmof.cmdline.MENU.STANDARD</p>
   
   <p>&nbsp;</p>
   
   <p><b>Where should I place platform specific
   messages ? </b></p>
   
   <p>As described in the message bundle file pegasusServer_en.txt messages belong
   into the section corresponding the file they are created in. This does account
   the same to platform specific messages.</p>
   <p>If a message is generated inside a source file not specific to a single
   platform, the message should be part of the message bundle section of that
   source file.</p>
   <p>If a new platform specific message is generated inside a platform specific
   source file, the message belongs to the platform specific section of the
   message bundle file.</p>
   
   <p><i>Examples:</i></p>
   
   <p>ProviderManager.ProviderAgent.ProviderAgent.UNINITIALIZED_SECURITY_SETUP.PEGASUS_OS_ZOS
   - this message is and should be part of the section for the ProviderAgent as it
   is generated inside the provider agent and not a z/OS platform specific file</p>
   <p>Common.safCheckzOS_inline.BAD_WBEM_SECURITY_SETUP - this message does and
   should reside inside the platform specific section as the message is generated
   in a z/OS platform only file</p>
   
   <p>&nbsp;</p>
   
 <h4> 2.2.5 Localized Exceptions</h4> <h4> 2.2.5 Localized Exceptions</h4>
 <p><br> <p><br>
 The base Exception class, and derived classes, have been updated to The base Exception class, and derived classes, have been updated to
 support localization.&nbsp; Constructors have been added that take a support localization.&nbsp; Constructors have been added that take a
 MessageLoaderParms object.&nbsp; These constructors will use the MessageLoaderParms object.&nbsp; These constructors will use the
 MessageLoaderParms object to call the MessageLoader to load the MessageLoaderParms object to call the MessageLoader to load the
 localized exception message.&nbsp; The localized message is saved in  localized exception message.&nbsp; The localized message is saved in the
 the Exception.&nbsp; The ContentLanguages object returned by  Exception.&nbsp; The ContentLanguageList object returned by MessageLoader
 MessageLoader is also saved in the Exception.&nbsp; This indicates the  is also saved in the Exception.&nbsp; This indicates the language of
 language of the message.&nbsp; The ContentLanguages object is used  the message.&nbsp; The ContentLanguageList object is used later to set the
 later to set the Content-Language header in the HTTP message to the  Content-Language header in the HTTP message to the client. <br>
 client. <br>  
 &nbsp; </p> &nbsp; </p>
 <p>The old Exception constructors that take a String will remain.&nbsp; <p>The old Exception constructors that take a String will remain.&nbsp;
 These should be used in cases where the code throwing the exception is These should be used in cases where the code throwing the exception is
Line 614 
Line 721 
 <ul> <ul>
   <li> Are there localized string properties that need to be   <li> Are there localized string properties that need to be
 supported?&nbsp; If so, then the client will use Accept-Language to supported?&nbsp; If so, then the client will use Accept-Language to
 request specific languages for these properties.&nbsp; If the  request specific languages for these properties.&nbsp; If the properties
 properties are read-only, use MessageLoader to load the localized  are read-only, use MessageLoader to load the localized strings for the
 strings for the properties.</li>  properties.</li>
   <li> If you have a localized read/write string property, then the   <li> If you have a localized read/write string property, then the
 client will use Content-Language to set the property with an associated client will use Content-Language to set the property with an associated
 language.&nbsp; The client will expect to be able to retrieve the language.&nbsp; The client will expect to be able to retrieve the
Line 645 
Line 752 
 <ul> <ul>
   <li> Pegasus will set the Accept-Language from the client into the   <li> Pegasus will set the Accept-Language from the client into the
 thread in which the provider is running.&nbsp; By using the thread in which the provider is running.&nbsp; By using the
 useThreadLocale setting in MessageLoaderParms, providers can easily  useThreadLocale setting in MessageLoaderParms, providers can easily load
 load strings using the client's requested Accept-Language.&nbsp; The  strings using the client's requested Accept-Language.&nbsp; The
 provider does not need to know what the Accept-Language is.&nbsp; This provider does not need to know what the Accept-Language is.&nbsp; This
 is the recommended method to load messages based on the client's  is the recommended method to load messages based on the client's request.</li>
 request.</li>  
   <br>   <br>
 &nbsp; <li> The OperationContext will contain an AcceptLanguages object  &nbsp; <li> The OperationContext will contain an AcceptLanguageList object
 that has the Accept-Language requested by the client.&nbsp; The  that has the Accept-Language requested by the client.&nbsp; The provider
 provider can use this AcceptLanguages object to load strings with  can use this AcceptLanguageList object to load strings with MessageLoader.</li>
 MessageLoader.</li>  
 </ul> </ul>
 <p><br> <p><br>
 The OperationContext will also contain a ContentLanguages object that  The OperationContext will also contain a ContentLanguageList object that
 is set from the Content-Language in the client request.&nbsp; This is is set from the Content-Language in the client request.&nbsp; This is
 the language of the CIM objects being passed to the provider on that the language of the CIM objects being passed to the provider on that
 request.&nbsp; A localized provider should store the content language request.&nbsp; A localized provider should store the content language
Line 669 
Line 774 
 returning by calling setContext( ) on the ResponseHandler.&nbsp; This returning by calling setContext( ) on the ResponseHandler.&nbsp; This
 will be used to set the Content-Language in the CIM response message will be used to set the Content-Language in the CIM response message
 sent back to the client.&nbsp; If setContext( ) is not called, then no sent back to the client.&nbsp; If setContext( ) is not called, then no
 Content-Language will be returned to the client.&nbsp; setContext( )  Content-Language will be returned to the client.&nbsp; The setContext( )
 should only be called once per response. <br>  function should only be called once per response. <br>
 &nbsp; </p> &nbsp; </p>
 <h3> 3.2 Sample Code</h3> <h3> 3.2 Sample Code</h3>
 <p><br> <p><br>
Line 714 
Line 819 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We are going to let the message loader parameters default to use the <br> // We are going to let the message loader parameters default to use the <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // AcceptLanguages that Pegasus set into our thread. <br>  // AcceptLanguageList that Pegasus set into our thread. <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // (this equals the AcceptLanguages requested by the client) <br>  // (this equals the AcceptLanguageList requested by the client) <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: This parms object could be constructed once and <br> // Note: This parms object could be constructed once and <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Line 750 
Line 855 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // of parms to the language that it found for the message. <br> // of parms to the language that it found for the message. <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 ContentLanguages rtnLangs = parms.contentlanguages; </p>  ContentLanguageList rtnLangs = parms.contentlanguages; </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We need to tag the instance we are returning with the <br> // We need to tag the instance we are returning with the <br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the
Line 782 
Line 887 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We are going to let the message loader parameters default to use the <br> // We are going to let the message loader parameters default to use the <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // AcceptLanguages that Pegasus set into our thread. <br>  // AcceptLanguageList that Pegasus set into our thread. <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // (this equals the AcceptLanguages requested by the client) <br>  // (this equals the AcceptLanguageList requested by the client) <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: This parms object could be constructed once and <br> // Note: This parms object could be constructed once and <br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Line 819 
Line 924 
 What happens if the client sets the read/write property with a What happens if the client sets the read/write property with a
 Content-Language that is not one of the supported languages for the Content-Language that is not one of the supported languages for the
 read/only property?&nbsp; This provider allows the client to set any read/only property?&nbsp; This provider allows the client to set any
 language into the read/write property, and get that property back in  language into the read/write property, and get that property back in the
 the same language.&nbsp; This becomes an issue when the client does a  same language.&nbsp; This becomes an issue when the client does a
 getInstance( ) later, because the Content-Language on the returned getInstance( ) later, because the Content-Language on the returned
 instance applies to all the properties.&nbsp; A related issue is what  instance applies to all the properties.&nbsp; A related issue is what to
 to return for Content-Language when the client does enumerateInstances,  return for Content-Language when the client does enumerateInstances,
 but the instances have different languages.&nbsp; Recall that but the instances have different languages.&nbsp; Recall that
 Content-Language applies to the entire response (a limitation in the  Content-Language applies to the entire response (a limitation in the CIM
 CIM specification). <br>  specification). <br>
 &nbsp; </p> &nbsp; </p>
 <p>NOTE:&nbsp; Indication Providers have other special considerations <p>NOTE:&nbsp; Indication Providers have other special considerations
 for language support.&nbsp; Please refer to&nbsp; PEP58. <br> for language support.&nbsp; Please refer to&nbsp; PEP58. <br>
Line 852 
Line 957 
 (SC41-5607-02).&nbsp; The Pegasus string literals will be compiled with (SC41-5607-02).&nbsp; The Pegasus string literals will be compiled with
 the UTF-8 compile switch described in this section.&nbsp; OS/400 the UTF-8 compile switch described in this section.&nbsp; OS/400
 provider developers should strongly consider using the same compile provider developers should strongly consider using the same compile
 switch for their string literals.&nbsp; This would allow the literals  switch for their string literals.&nbsp; This would allow the literals to
 to match the UTF-8 encoding expected by the C-runtime.</li>  match the UTF-8 encoding expected by the C-runtime.</li>
 </ul> </ul>
 <h2> 4. 0 Client Developers</h2> <h2> 4. 0 Client Developers</h2>
 <p><br> <p><br>
Line 878 
Line 983 
 <p>&nbsp;&nbsp; // Language priority is martian, pig-latin, and <p>&nbsp;&nbsp; // Language priority is martian, pig-latin, and
 french.&nbsp; We should <br> french.&nbsp; We should <br>
 &nbsp;&nbsp; // get french back, even though its the lowest priority <br> &nbsp;&nbsp; // get french back, even though its the lowest priority <br>
 &nbsp; AcceptLanguages acceptLangs; <br>  &nbsp; AcceptLanguageList acceptLangs; <br>
 &nbsp; acceptLangs.add(AcceptLanguageElement("x-martian")); <br>  &nbsp; acceptLangs.insert(LanguageTag("x-martian"), 1.0); <br>
 &nbsp; acceptLangs.add(AcceptLanguageElement("fr", 0.1)); <br>  &nbsp; acceptLangs.insert(LanguageTag("fr"), 0.1); <br>
 &nbsp; acceptLangs.add(AcceptLanguageElement("x-pig-latin", 0.4)); </p>  &nbsp; acceptLangs.insert(LanguageTag("x-pig-latin"), 0.4); </p>
 <p>&nbsp;&nbsp;&nbsp; // Set the requested languages into the CIMClient <br> <p>&nbsp;&nbsp;&nbsp; // Set the requested languages into the CIMClient <br>
 &nbsp; client.setRequestAcceptLanguages(acceptLangs); </p> &nbsp; client.setRequestAcceptLanguages(acceptLangs); </p>
 <p>&nbsp;&nbsp; // Get the instance <br> <p>&nbsp;&nbsp; // Get the instance <br>
Line 900 
Line 1005 
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 get(returnedString); </p> get(returnedString); </p>
 <p>&nbsp; // Check that we got back french <br> <p>&nbsp; // Check that we got back french <br>
 &nbsp; ContentLanguages CL_FR("fr"); <br>  &nbsp; ContentLanguageList CL_FR(); <br>
   &nbsp; CL_FR.append(LanguageTag("fr")); <br>
 &nbsp; String expectedFRString = "oui"; <br> &nbsp; String expectedFRString = "oui"; <br>
 &nbsp; PEGASUS_ASSERT(CL_FR == client.getResponseContentLanguages()); <br> &nbsp; PEGASUS_ASSERT(CL_FR == client.getResponseContentLanguages()); <br>
 &nbsp; PEGASUS_ASSERT(expectedFRString == returnedString); </p> &nbsp; PEGASUS_ASSERT(expectedFRString == returnedString); </p>
Line 942 
Line 1048 
 ICU.&nbsp; If ICU is installed on the client system then CIMClient will ICU.&nbsp; If ICU is installed on the client system then CIMClient will
 set the Accept-Language from the default ICU process locale.&nbsp; If set the Accept-Language from the default ICU process locale.&nbsp; If
 ICU is not installed then the caller is required to set an ICU is not installed then the caller is required to set an
 AcceptLanguages into CIMClient that meets the ISO-639 and IS0-3166  AcceptLanguageList into CIMClient that meets the ISO-639 and IS0-3166
 standards.&nbsp; Note:&nbsp; this is useful for local clients, such as standards.&nbsp; Note:&nbsp; this is useful for local clients, such as
 the Pegasus CLIs, where ICU would be installed on both the client and the Pegasus CLIs, where ICU would be installed on both the client and
 server sides. <br> server sides. <br>
Line 971 
Line 1077 
 <p><br> <p><br>
 The make messages target will compile these resource bundles. </p> The make messages target will compile these resource bundles. </p>
 <p>Note:&nbsp; As described above, the resource bundle path in <p>Note:&nbsp; As described above, the resource bundle path in
 MessageLoaderParms defaults to the server resource bundle.&nbsp; For  MessageLoaderParms defaults to the server resource bundle.&nbsp; For CLI
 CLI messages, you will need to specify the bundle for your CLI. <br>  messages, you will need to specify the bundle for your CLI. <br>
 &nbsp; </p> &nbsp; </p>
 <h3> 5.2 Server Messages</h3> <h3> 5.2 Server Messages</h3>
 <p><br> <p><br>
Line 987 
Line 1093 
 <p><b>Server Design Points:</b> <br> <p><b>Server Design Points:</b> <br>
 &nbsp; </p> &nbsp; </p>
 <p>The CIMMessage object has been expanded to include an <p>The CIMMessage object has been expanded to include an
 AcceptLanguages object and a ContentLanguages object.&nbsp; For  AcceptLanguageList object and a ContentLanguageList object in its
   OperationContext member.&nbsp; For
 CIMRequestMessage, these objects contain the Accept-Language and CIMRequestMessage, these objects contain the Accept-Language and
 Content-Language headers that were built from the client request.&nbsp; Content-Language headers that were built from the client request.&nbsp;
 For CIMResponseMessage, the ContentLanguages object is used to build  For CIMResponseMessage, the ContentLanguageList object is used to build the
 the Content-Language header associated with the CIM <i>objects </i>in  Content-Language header associated with the CIM <i>objects </i>in the
 the response message.&nbsp; The AcceptLanguages object in the  response message.&nbsp; The AcceptLanguageList object in the
 CIMResponseMessage is ignored. <br> CIMResponseMessage is ignored. <br>
 &nbsp; </p> &nbsp; </p>
 <p>The localization of the cimException object in the <p>The localization of the cimException object in the
 CIMResponseMessage is handled separately from the CIM objects.&nbsp;  CIMResponseMessage is handled separately from the CIM objects.&nbsp; The
 The message string in the cimException object is assumed to have been  message string in the cimException object is assumed to have been
 localized by the time it is built into the XML.&nbsp; For this reason, localized by the time it is built into the XML.&nbsp; For this reason,
 the localization of the exception is the responsibility of the code the localization of the exception is the responsibility of the code
 throwing the exception.&nbsp; (The goal of the design is to make that throwing the exception.&nbsp; (The goal of the design is to make that
 easy - see below).&nbsp; The ContentLanguages object in the  easy - see below).&nbsp; The ContentLanguageList object in the
 CIMResponseMessage has NO relation to this exception.&nbsp; The CIMResponseMessage has NO relation to this exception.&nbsp; The
 cimException object keeps its own localization information once it is cimException object keeps its own localization information once it is
 created. <br> created. <br>
Line 1009 
Line 1116 
 <p>To enable exceptions to be localized, the ability was added to set a <p>To enable exceptions to be localized, the ability was added to set a
 global language for all the code running from a Pegasus Thread global language for all the code running from a Pegasus Thread
 object.&nbsp; The top level code for a Thread can set a global object.&nbsp; The top level code for a Thread can set a global
 AcceptLanguages object that can be accessed by all the low-level  AcceptLanguageList object that can be accessed by all the low-level
 functions that it calls.&nbsp; This will allow an exception thrown by functions that it calls.&nbsp; This will allow an exception thrown by
 the low-level function to be localized based on this global the low-level function to be localized based on this global
 AcceptLanguages object.&nbsp; Note:&nbsp; This applies only to Threads  AcceptLanguageList object.&nbsp; Note:&nbsp; This applies only to Threads
 that are managed by a ThreadPool. <br> that are managed by a ThreadPool. <br>
 &nbsp; </p> &nbsp; </p>
 <p>Each service in the request path of the Pegasus server sets the <p>Each service in the request path of the Pegasus server sets the
 AcceptLanguages into its Thread from the AcceptLanguages in the  AcceptLanguageList into its Thread from the AcceptLanguageList in the
 CIMRequestMessage object that it dequeues.&nbsp; This sets the global CIMRequestMessage object that it dequeues.&nbsp; This sets the global
 langauge for all the functions in the same thread that are called below langauge for all the functions in the same thread that are called below
 handleEnqueue.&nbsp; <i>If you are writing a new service that  handleEnqueue.&nbsp; <i>If you are writing a new service that processes
 processes requests, or discover a request service that was missed,  requests, or discover a request service that was missed, please do
 please do this.&nbsp;</i> The CIMOperationRequestDispatcher service is  this.&nbsp;</i> The CIMOperationRequestDispatcher service is an example. <br>
 an example. <br>  
 &nbsp; </p> &nbsp; </p>
 <p><b>How to Throw a Localized Exception from Server code:</b> <br> <p><b>How to Throw a Localized Exception from Server code:</b> <br>
 &nbsp; </p> &nbsp; </p>
 <p>With all that background, here is how code running in a Pegasus <p>With all that background, here is how code running in a Pegasus
 service can throw a localized exception: <br> service can throw a localized exception: <br>
 This example assumes that the top-level code in the service had set the This example assumes that the top-level code in the service had set the
 global thread AcceptLanguages beforehand.&nbsp; As described above,  global thread AcceptLanguageList beforehand.&nbsp; As described above,
 every service in Pegasus should do that.&nbsp; The code here may be every service in Pegasus should do that.&nbsp; The code here may be
 buried several layers deep in the call chain, but does not need to know buried several layers deep in the call chain, but does not need to know
 the AcceptLanguage of the current client request. </p>  the AcceptLanguagList of the current client request. </p>
 <p>// First, construct a MessageLoaderParms <br> <p>// First, construct a MessageLoaderParms <br>
 // <br> // <br>
 // Notes: <br> // Notes: <br>
Line 1042 
Line 1148 
 //&nbsp; 3) The MessageLoaderParms will default to use the Pegasus //&nbsp; 3) The MessageLoaderParms will default to use the Pegasus
 server resource bundle <br> server resource bundle <br>
 //&nbsp; 4) The MessageLoaderParms will default to use the //&nbsp; 4) The MessageLoaderParms will default to use the
 AcceptLanguages set into the current Thread.&nbsp; Don't change this! <br>  AcceptLanguageList set into the current Thread.&nbsp; Don't change this! <br>
 //&nbsp; 5) You might need to set the arguments for the message into //&nbsp; 5) You might need to set the arguments for the message into
 the MessageLoaderParms <br> the MessageLoaderParms <br>
 MessageLoaderParms parms("errorMessageID", "default message"); </p> MessageLoaderParms parms("errorMessageID", "default message"); </p>
Line 1070 
Line 1176 
 e.getMessage()); <br> e.getMessage()); <br>
 } <br> } <br>
 &nbsp; </p> &nbsp; </p>
 <p>This type of code would have lost the ContentLanguages saved in "e",  <p>This type of code would have lost the ContentLanguageList saved in "e",
 so that the Content-Language would not be set in HTTP response to the so that the Content-Language would not be set in HTTP response to the
 client. <br> client. <br>
 &nbsp; </p> &nbsp; </p>
 <p>For Pegasus 2.3, these types of macro calls can stay.&nbsp; The <p>For Pegasus 2.3, these types of macro calls can stay.&nbsp; The
 TraceableCIMException constructed by the macro will  TraceableCIMException constructed by the macro will "re-localize".&nbsp;
 "re-localize".&nbsp; That is, the "CIM" part of the message (the part  That is, the "CIM" part of the message (the part based on the error
 based on the error code) will be localized at throw time, and the  code) will be localized at throw time, and the ContentLanguageList
 ContentLanguages re-established.&nbsp; A key is to avoid a "language  re-established.&nbsp; A key is to avoid a "language mismatch" problem
 mismatch" problem between the CIM part of the message and the extra  between the CIM part of the message and the extra part of the
 part of the message.&nbsp; The design point here is that all internal  message.&nbsp; The design point here is that all internal exceptions
 exceptions thrown by Pegasus code are localized using the global  thrown by Pegasus code are localized using the global AcceptLanguageList
 AcceptLanguages of the Thread...see above. <br>  of the Thread...see above. <br>
 &nbsp; </p> &nbsp; </p>
 <p>In the future, it will be safer and more maintainable to use of <p>In the future, it will be safer and more maintainable to use of
 the&nbsp; new "localized" flavors of the macro.&nbsp; For example: <br> the&nbsp; new "localized" flavors of the macro.&nbsp; For example: <br>
Line 1100 
Line 1206 
 e.getMessage( )); <br> e.getMessage( )); <br>
 } <br> } <br>
 &nbsp; </p> &nbsp; </p>
 <p>This guarantees that the ContentLanguages in "e" is copied to the  <p>This guarantees that the ContentLanguageList in "e" is copied to the
 newly created TraceableCIMException. <br> newly created TraceableCIMException. <br>
 &nbsp; </p> &nbsp; </p>
 <p>In the case where the extra message for the CIMException is <p>In the case where the extra message for the CIMException is
Line 1119 
Line 1225 
 <p><br> <p><br>
 New methods have been added to Logger to take a message ID of a message New methods have been added to Logger to take a message ID of a message
 to be loaded from the Pegasus server resource bundle.&nbsp; The caller to be loaded from the Pegasus server resource bundle.&nbsp; The caller
 is only required to pass in the message ID, the old "hardcoded"  is only required to pass in the message ID, the old "hardcoded" message,
 message, and the args.&nbsp; The Logger will use MessageLoader to load  and the args.&nbsp; The Logger will use MessageLoader to load the
 the message in the locale of the Pegasus server <i>process</i>, using  message in the locale of the Pegasus server <i>process</i>, using the
 the hardcoded message as the default string.&nbsp; Please refer to  hardcoded message as the default string.&nbsp; Please refer to
 pegasus/src/Pegasus/Logger.h. </p> pegasus/src/Pegasus/Logger.h. </p>
 <p>Note:&nbsp; Messages sent to the "logs", whether the system logs or <p>Note:&nbsp; Messages sent to the "logs", whether the system logs or
 the Pegasus log file, are converted to UTF-8 before being sent. <br> the Pegasus log file, are converted to UTF-8 before being sent. <br>
Line 1134 
Line 1240 
 -- the user should not be required to tell the CLI what the locale -- the user should not be required to tell the CLI what the locale
 is.&nbsp;&nbsp; For the CLIs that are CIM clients (cimconfing, is.&nbsp;&nbsp; For the CLIs that are CIM clients (cimconfing,
 cimprovider) there are two sets of messages to localize&nbsp; -- cimprovider) there are two sets of messages to localize&nbsp; --
 messages generated in the CLI process itself, and messages returned  messages generated in the CLI process itself, and messages returned from
 from the Pegasus server .&nbsp; For CLIs that are directly linked into  the Pegasus server .&nbsp; For CLIs that are directly linked into
 Pegasus (cimmofl), all the messages are generated in the CLI's process, Pegasus (cimmofl), all the messages are generated in the CLI's process,
 but the CLI may call Pegasus APIs that are coded to localize based on a but the CLI may call Pegasus APIs that are coded to localize based on a
 client's requested languages. <br> client's requested languages. <br>
Line 1143 
Line 1249 
 <p>Code in the client side of the client/server CLIs (eg. cimconfig, <p>Code in the client side of the client/server CLIs (eg. cimconfig,
 cimmof), or in directly linked CLIs (cimmofl), should use the cimmof), or in directly linked CLIs (cimmofl), should use the
 _useProcessLocale "master switch" described in the Message Loading _useProcessLocale "master switch" described in the Message Loading
 section.&nbsp; This will cause all messages, including exceptions  section.&nbsp; This will cause all messages, including exceptions thrown
 thrown by Pegasus APIs,&nbsp; to be loaded in the locale based on the  by Pegasus APIs,&nbsp; to be loaded in the locale based on the
 environment in which the program is running.&nbsp; This locale can be environment in which the program is running.&nbsp; This locale can be
 set by the user before running the program. <br> set by the user before running the program. <br>
 &nbsp; </p> &nbsp; </p>
Line 1158 
Line 1264 
 &nbsp; </p> &nbsp; </p>
 <p> </p> <p> </p>
 <hr> <hr>
 <p><i>Copyright (c) 2003 BMC Software; Hewlett-Packard Development  <p>Licensed to The Open Group (TOG) under one or more contributor license
 Company, L.P.; IBM Corp.; The Open Group</i> </p>  agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
 <p><i>Permission is hereby granted, free of charge, to any person  this work for additional information regarding copyright ownership.
 obtaining a copy&nbsp; of this software and associated documentation  Each contributor licenses this file to you under the OpenPegasus Open
 files (the "Software"), to deal in the Software without restriction,  Source License; you may not use this file except in compliance with the
 including without limitation the rights to use, copy, modify, merge,  License.</p>
 publish, distribute, sublicense, and/or sell copies of the Software,  <p>Permission is hereby granted, free of charge, to any person obtaining a
 and to permit persons to whom the Software is furnished to do so,  copy of this software and associated documentation files (the "Software"),
 subject to the following conditions:</i> </p>  to deal in the Software without restriction, including without limitation
 <p><i>THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE  the rights to use, copy, modify, merge, publish, distribute, sublicense,
 INCLUDED IN ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE  and/or sell copies of the Software, and to permit persons to whom the
 SOFTWARE IS PROVIDED&nbsp; "AS IS", WITHOUT WARRANTY OF ANY KIND,  Software is furnished to do so, subject to the following conditions:</p>
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  <p>The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.</p>
   <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</i> <br>  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></body>
 &nbsp; <br>  
 &nbsp; </p>  
 </body>  
 </html> </html>


Legend:
Removed from v.1.5  
changed lines
  Added in v.1.12

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2